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

Ram*_*ngh 25 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?
Run Code Online (Sandbox Code Playgroud)

Kir*_*sky 22

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

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

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


Jer*_*fin 14

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


Mic*_*urr 7

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

综上所述,

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

除了对Kirill V. Lyadvinsky提供的标准的支持(矢量排序是否使迭代器失效?):

  • 25/5"算法库"

如果算法的"效果"部分表示修改了作为参数传递的任何迭代器指向的值,则该算法还有一个额外的类型要求:该参数的类型应满足可变迭代器的要求(24.1).

  • 24.1/4"迭代器要求"

除了它的类别之外,正向,双向或随机访问迭代器也可以是可变的或常量的,这取决于表达式*i的结果是作为引用还是作为对常量的引用.