std :: map中的vector <int> :: iterator与list <int> :: iterator键

hhb*_*lly 3 c++ stdmap

为什么可以定义vector :: iterator to int的map,但是list :: iterator to int的map不能?

#include <vector>
#include <list>
#include <map>
#include <algorithm>
using namespace std;


int main()
{
    int ia[] = {1,2,3,4,5,6,7,8,9,0};

    vector<int> v(begin(ia), end(ia));
    auto it1 = find(begin(v), end(v), 4);
    map< vector<int>::const_iterator, int > m1;
    m1.insert(map<vector<int>::const_iterator, int>::value_type(it1,*it1));

    list<int> l(begin(ia), end(ia));
    auto it2 = find(begin(l), end(l),5);
    map< list<int>::const_iterator, int> m2;
    m2.insert(map<list<int>::const_iterator, int>::value_type(it2,*it2)); //doesn't compile

}
Run Code Online (Sandbox Code Playgroud)

错误1错误C2678:二进制'<':找不到运算符,它接受类型为'const std :: _ List_const_iterator <_Mylist>'的左操作数(或者没有可接受的转换)

Use*_*ess 5

std::map要求密钥可与<比较器或提供的比较器相比较.

从概念上讲,随机访问迭代器是可比较的,但双向迭代器不是.std::vector迭代器是随机访问,std::list迭代器是双向的.

因此,您的列表迭代器不满足std::map密钥类型的可比较要求.如果您提供一个比较器,可以有效地决定哪个std::list::const_iterator应该先于另一个比较器,您可以将它传递给地图,这将起作用.粗略素描:

struct ListIterCmp {
    bool operator() (list<int>::const_iterator a, list<int>::const_iterator b)
    {
        // how?
    }
};
map< list<int>::const_iterator, int, ListIterCmp> m2;
// this should work now...
Run Code Online (Sandbox Code Playgroud)

cppreference文档包括我以前用旧的一切SGI的文档,并且还在更新.请参阅两者都描述a<b了RandomAccessIterator,而不是BidirectionalIterator概念.