为什么可以定义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>'的左操作数(或者没有可接受的转换)
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概念.
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |