我了解到随机访问迭代器和双向迭代器之间是不同的。
随机访问迭代器可以使用+, -, += , -=, []
运算符,而双向迭代器则不能。
映射使用双向迭代器。但是地图仍然使用[]
运算符。
例如:
map<int,int> a;
a[5]++;
效果很好。
我不知道这是怎么做的。
如果有机会,你能告诉我怎么做吗?
答案 0 :(得分:1)
指针支持[]
,其定义为p[i]
等效于*(p + i)
。 RandomAccessIterator 的行为类似于指针,因此它们也具有相同的含义。
许多容器也支持[]
。其中有两种。
第一类是迭代器为SequenceContainer的RandomAccessIterator,SequenceContainer::operator[]
的参数为std::size_t
,即通过元素在元素中的位置来标识元素的元素顺序。 vec[i]
与vec.begin()[i]
相同,与*(vec.begin() + i)
相同。
如果您可以轻松找到特定索引处的元素,则可以轻松地将迭代器增加或减少大于1的偏移量。
第二种是具有mapped_type
的{{3}}或AssociativeContainer。 AssociativeContainer::operator[]
的参数为AssociativeContainer::key_type
,即通过其值标识元素的内容。
轻松查找具有特定值的元素无助于沿序列移动。事实证明,当前已知的允许按值轻松访问的数据结构并不擅长知道哪个元素n
。
答案 1 :(得分:1)
随机访问迭代器可以使用+,-,+ =,-=,[]运算符,但不能使用双向迭代器。
这太过简单了,您已经找到了原因。
双向迭代器无法执行随机访问操作。对于某些容器,[]
是随机访问操作。它会将您带到容器中一些“距离”。
但是,对于像地图这样的关联容器而言,它不是:这是专门为那些容器设计的操作。它需要一个 key 并为您提供一个 value 。这是另一种操作。
请尝试根据特征和行为而不是符号进行思考,因为符号根据上下文具有不同的含义。如果要了解某个给定上下文中符号的含义,可以参考a reference或your book。