我了解到随机访问迭代器和双向迭代器之间的区别。随机访问迭代器可以使用+, -, += , -=, []
运算符,但双向迭代器不能。 map使用双向迭代器。但地图仍然使用[]
运算符。
例如:
map<int,int> a;
a[5]++;
它运作良好。
我不明白这是做什么的。
不管怎样,你能告诉我怎么样吗?
随机访问迭代器可以使用+, - ,+ =, - =,[]运算符但双向迭代器不能。
这是一个过于简单化,你已经发现了原因。
双向迭代器无法执行随机访问操作。对于某些容器,[]
是一种随机访问操作。它会带你到容器的“距离”。
但是对于像地图这样的关联容器,它不是:它是专门为这些容器设计的操作。它需要一个键并为您提供一个值。这是一个不同的操作。
尝试考虑特征和行为而不是符号,因为符号根据上下文具有不同的含义。如果您想了解符号在某些特定上下文中的含义,可以参考a reference或your book。
指针支持[]
,定义为p[i]
等同于*(p + i)
。 RandomAccessIterators就像指针一样,所以它们也支持它,具有相同的含义。
许多容器也支持[]
。其中有两种。
第一种是SequenceContainers,它的迭代器是RandomAccessIterator,而SequenceContainer::operator[]
的参数是std::size_t
,即通过它在序列中的位置来识别元素的东西。 vec[i]
与vec.begin()[i]
相同,与*(vec.begin() + i)
相同。
如果您可以在特定索引处轻松找到元素,则可以通过大于1的偏移量轻松地递增或递减迭代器。
第二种是那些有AssociativeContainer的UnorderedAssociativeContainerss或mapped_type
s。 AssociativeContainer::operator[]
的参数是AssociativeContainer::key_type
,即通过它的值来标识元素的东西。
轻松查找具有特定值的元素无助于沿序列移动。事实证明,目前已知的数据结构允许通过值轻松访问,并不能很好地知道哪个元素是n
。