C ++ STL,我想知道双向迭代器和map中的operator []之间有什么区别

时间:2019-03-01 12:33:26

标签: c++ stl

我了解到随机访问迭代器和双向迭代器之间是不同的。 随机访问迭代器可以使用+, -, += , -=, []运算符,而双向迭代器则不能。 映射使用双向迭代器。但是地图仍然使用[]运算符。

例如:

map<int,int> a;
a[5]++;

效果很好。

我不知道这是怎么做的。

如果有机会,你能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:1)

指针支持[],其定义为p[i]等效于*(p + i) RandomAccessIterator 的行为类似于指针,因此它们也具有相同的含义。

许多容器也支持[]。其中有两种。

第一类是迭代器为SequenceContainerRandomAccessIteratorSequenceContainer::operator[]的参数为std::size_t,即通过元素在元素中的位置来标识元素的元素顺序。 vec[i]vec.begin()[i]相同,与*(vec.begin() + i)相同。

如果您可以轻松找到特定索引处的元素,则可以轻松地将迭代器增加或减少大于1的偏移量。

第二种是具有mapped_type的{​​{3}}或AssociativeContainerAssociativeContainer::operator[]的参数为AssociativeContainer::key_type,即通过其值标识元素的内容。

轻松查找具有特定值的元素无助于沿序列移动。事实证明,当前已知的允许按值轻松访问的数据结构并不擅长知道哪个元素n

答案 1 :(得分:1)

  

随机访问迭代器可以使用+,-,+ =,-=,[]运算符,但不能使用双向迭代器。

这太过简单了,您已经找到了原因。

双向迭代器无法执行随机访问操作。对于某些容器,[]是随机访问操作。它会将您带到容器中一些“距离”。

但是,对于像地图这样的关联容器而言,它不是:这是专门为那些容器设计的操作。它需要一个 key 并为您提供一个 value 。这是另一种操作。

请尝试根据特征行为而不是符号进行思考,因为符号根据上下文具有不同的含义。如果要了解某个给定上下文中符号的含义,可以参考a referenceyour book