[英]Does a vector sort invalidate iterators?
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?
根据C ++标准§23.1/ 11:
除非另有说明 (显式或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给库函数不应使迭代器无效 ,或更改该容器中对象的值。
§25.3“排序和相关操作”没有指定迭代器将被无效,因此问题中的迭代器应该保持有效。
他们仍然指向开始和结束。 向量的那些插槽中的值可能已更改,但每个驻留的存储位置保持不变。
std::sort
不会使向量的迭代器失效。 排序模板使用迭代器上的*
运算符来访问和修改向量的内容,并通过迭代器修改向量元素到向量中已有的元素将不会使任何迭代器无效。
综上所述,
除了对Kirill V. Lyadvinsky提供的标准的支持( 矢量排序是否使迭代器失效? ):
如果算法的“效果”部分表示修改了作为参数传递的任何迭代器指向的值,则该算法还有一个额外的类型要求:该参数的类型应满足可变迭代器的要求(24.1)。
除了它的类别之外,正向,双向或随机访问迭代器也可以是可变的或常量的,这取决于表达式* i的结果是作为引用还是作为对常量的引用。
std::vector
将其元素保存在连续的内存中。 std::sort
按值获取参数(迭代器)并重新排列它们之间的序列。 最终结果是你的局部变量start
和end
仍然指向向量的第一个和最后一个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.