【问题标题】:Number of permissible active iterators into a vector向量中允许的活动迭代器的数量
【发布时间】:2011-03-26 15:02:47
【问题描述】:
例如以下是否有效?
std::vector<int> vec(5, 0);
std::vector<int>::const_iterator it1(vec.begin());
std::vector<int>::const_iterator it2(vec.begin());
//Use it1 and it2 like they don't know about each other.
允许多个活动迭代器的容器是否有特殊名称?
【问题讨论】:
标签:
c++
templates
vector
iterator
standards
【解决方案1】:
是的,它是有效的。
您可以将尽可能多的迭代器放入一个向量中,因为您的系统有足够的内存来保存迭代器。
这种容器的特殊名称是“任何 STL 容器”。所有容器都允许这样做。
也许可以解释一下为什么您认为这不应该被允许?
【解决方案2】:
这绝对是允许的。您必须担心的是您是否开始擦除或插入元素。不同的容器通过修改函数来使迭代器失效有不同的行为,您必须查看文档。例如,vector 上的 erase 会使删除元素之后的所有迭代器和元素引用无效。
【解决方案3】:
只要您不执行使其他迭代器无效的操作,迭代器的数量就没有任何限制。某些操作(如插入或删除)可能会使所有其他迭代器无效。 STL 容器迭代器的工作方式,它们无法(通常)处理通过其他迭代器完成的插入和删除。
请注意,使用容器函数插入/删除元素也会导致迭代器无效。
根本问题是 STL 容器对活动迭代器一无所知,因此它们无法告诉迭代器发生了变化。