【问题标题】:How to compare two map iterator in c++?如何在 C++ 中比较两个映射迭代器?
【发布时间】:2022-01-04 12:23:51
【问题描述】:
#include <iostream>
#include<vector>
#include<map>
using namespace std;
int main() {
   vector<int> v1{1,2,3,4,5};
    auto it1 = v1.begin();
    auto it2 = v1.end();
    if(it1<it2){
        cout<<"TRUE"<<endl;             // Output: TRUE
    }

    map<int,int> m;
    m.insert(make_pair(1,2));
    m.insert(make_pair(5,7));
    auto it3 = m.begin();
    auto it4 = m.end();
    if(it3<it4){
        cout<<"TRUE"<<endl;           
    }   
    /*
    error: no match for 'operator<' (operand types are 'std::_Rb_tree_iterator<std::pair<const int, int> >' and 'std::_Rb_tree_iterator<std::pair<const int, int> >')
   18 |     if(it3<it4){
      |        ~~~^~~~
    */

}

Line (it1

【问题讨论】:

  • iterator categories 有不同的类型。 Vector 使用(旧版)随机访问迭代器,而 map 使用(旧版)双向迭代器。可以比较随机访问迭代器的排序,而双向迭代器则不能。
  • 除非你只是因为好奇才问(请edit你的问题说明这一点)然后请询问你原来的潜在问题。为什么需要比较地图迭代器的排序?你认为它会解决什么问题?
  • FWIW 考虑到标签,std::map 基本上是一棵红黑树,而不是哈希图(参见 std::unordered_map)。 (这就是为什么这个实现的迭代器被命名为_Rb_tree_iterator。)

标签: c++ dictionary stl hashmap iterator


【解决方案1】:

线 (it1

向量迭代器是随机访问迭代器。可以比较随机访问迭代器的顺序。

但是(it3

Map 迭代器不是随机访问迭代器。它们无法按顺序进行比较。

但是,如果您知道映射的比较器,那么您可以间接通过两个迭代器,并将键与比较器进行比较。您必须首先检查结束迭代器,因为您无法从中获取密钥(但您确实知道它在所有其他迭代器之后)。这仅适用于有序映射,例如std::map。它不适用于 std::unordered_map 等哈希映射。它也不会找出两个迭代器与多映射中相同元素的相对顺序。

一般来说,给定一对前向迭代器和结束迭代器,您可以通过从一个迭代器开始进行线性搜索来找到这对迭代器,直到找到第二个迭代器或容器的末尾。如果你在另一个迭代器之前找到 end,那么 other 是第一个;如果您确实找到了另一个迭代器,那么它就在之后。这当然具有线性的最坏情况复杂性。

【讨论】:

    【解决方案2】:

    请参阅此处了解迭代器类别的概述:https://en.cppreference.com/w/cpp/iterator

    std::map 有双向迭代器,而std::vector 有随机访问迭代器。后者可以通过&lt; 进行关联,第一个不行。

    如果您想知道地图中哪个元素排在第一位,可以使用 std::maps 元素根据键排序的事实:

    if (it3->first < it4->first) { ...
    

    一般来说,您需要考虑到地图可能会使用自定义比较器,因此更通用的方法是

    if ( m.key_comp()(it3->first,it4->first) ) { ...
    

    但是,当其中一个迭代器等于映射的 end 时,任何一种方式都会失败,因为您无法取消引用它来获取密钥。

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2012-03-03
      • 2013-03-14
      • 1970-01-01
      • 2017-04-29
      • 2021-04-15
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多