C ++ STL,我想知道map中的双向迭代器和operator []有什么不同

问题描述 投票:-1回答:2

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

例如:

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

它运作良好。

我不明白这是做什么的。

不管怎样,你能告诉我怎么样吗?

c++ stl
2个回答
1
投票

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

这是一个过于简单化,你已经发现了原因。

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

但是对于像地图这样的关联容器,它不是:它是专门为这些容器设计的操作。它需要一个键并为您提供一个值。这是一个不同的操作。

尝试考虑特征和行为而不是符号,因为符号根据上下文具有不同的含义。如果您想了解符号在某些特定上下文中的含义,可以参考a referenceyour book


1
投票

指针支持[],定义为p[i]等同于*(p + i)。 RandomAccessIterators就像指针一样,所以它们也支持它,具有相同的含义。

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

第一种是SequenceContainers,它的迭代器是RandomAccessIterator,而SequenceContainer::operator[]的参数是std::size_t,即通过它在序列中的位置来识别元素的东西。 vec[i]vec.begin()[i]相同,与*(vec.begin() + i)相同。

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

第二种是那些有AssociativeContainerUnorderedAssociativeContainerss或mapped_types。 AssociativeContainer::operator[]的参数是AssociativeContainer::key_type,即通过它的值来标识元素的东西。

轻松查找具有特定值的元素无助于沿序列移动。事实证明,目前已知的数据结构允许通过值轻松访问,并不能很好地知道哪个元素是n

© www.soinside.com 2019 - 2024. All rights reserved.