为什么可以定义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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。