Vector::<int>迭代器与 list::<int>itrator 键在 std::map
vector<int>::iterator versus list<int>::iterator keys in std::map
为什么可以定义 vector::iterator 到 int 的映射,而 list::iterator 到 int 的映射不能?
#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
}
错误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...
cpp首选项文档涵盖了我过去使用旧SGI文档的所有内容,并且仍在更新。看到两者都描述了 RandomAccessIterator 的a<b
,而不是双向迭代器概念。
您无法比较任何 T 的std::list<T>
迭代器。事实上,只有当两个迭代器都来自同一个向量时,std::vector<T>::iterator
才是可比的。
您无法比较std::list
迭代器的原因是它效率非常低 - 您必须从其中一个可能走到整个列表的末尾才能找到另一个元素不在它之后。这将是O(N)
复杂性,我们不希望像<
这样的简单操作。
我不能建议更换,因为我不知道你需要它做什么。因为 std::list
元素的地址是稳定的,所以您可以将这些地址用作map
的键。但我看不出这有什么用。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'