其他分享
首页 > 其他分享> > c – vector :: iterator与std :: map中的list :: iterator键

c – vector :: iterator与std :: map中的list :: iterator键

作者:互联网

为什么可以定义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

}

Error 1 error C2678: binary ‘<‘ : no operator found which takes a left-hand operand of type ‘const std::_List_const_iterator<_Mylist>’ (or there is no acceptable conversion)

解决方法:

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...

cppreference文档涵盖了我过去使用旧版SGI文档的所有内容,并且仍在更新中.请参阅两者都描述了RandomAccessIterator的< b,而不是BidirectionalIterator概念.

标签:c,stdmap
来源: https://codeday.me/bug/20190723/1511598.html