向量排序是否使迭代器无效?

时间:2010-10-07 20:08:24

标签: c++ sorting stl

 std::vector<string> names;
 std::vector<string>::iterator start = names.begin();
 std::vector<string>::iterator end = names.end();
 sort (start,end);
 //are my start and end valid at this point?
 //or they do not point to front and tail resp?

4 个答案:

答案 0 :(得分:20)

根据C ++标准§23.1/ 11:

  

除非另有说明(显式或通过根据其他函数定义函数),调用   容器成员函数或将容器作为参数传递给库函数不应该无效   <迭代器,或更改该容器中对象的值。

§25.3“排序和相关操作”没有指定迭代器将被无效,因此问题中的迭代器应该保持有效。

答案 1 :(得分:13)

他们仍然指向开始和结束。向量的那些插槽中的值可能已更改,但每个驻留的存储位置保持不变。

答案 2 :(得分:7)

std::sort不会使向量的迭代器失效。排序模板使用迭代器上的*运算符来访问和修改向量的内容,通过迭代器修改向量元素到向量中的元素不会使任何迭代器无效。

总之,

  • 您的现有迭代器不会失效
  • 但是,他们指向的元素可能已被修改

除了对Kirill V. Lyadvinsky(Does a vector sort invalidate iterators?)提供的标准的支持外:

  • 25/5“算法库”
  

如果算法的效果部分说   任何指向的值   作为参数传递的迭代器是   修改,然后该算法有一个   附加类型要求:类型   该论点应满足   可变迭代器的要求   (24.1)。

  • 24.1 / 4“迭代器要求”
  

除了它的类别,前锋,   双向或随机访问   迭代器也可以是可变的   常数取决于是否   表达式的结果* i表现为   引用或作为参考   恒定。

答案 3 :(得分:1)

std::vector将其元素保存在连续的内存中。 std::sort按值获取参数(迭代器)并重新排列它们之间的序列。最终结果是您的本地变量startend仍然指向向量的第一个和最后一个元素。