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?
答案 0 :(得分:20)
根据C ++标准§23.1/ 11:
除非另有说明(显式或通过根据其他函数定义函数),调用 容器成员函数或将容器作为参数传递给库函数不应该无效 <迭代器,或更改该容器中对象的值。
§25.3“排序和相关操作”没有指定迭代器将被无效,因此问题中的迭代器应该保持有效。
答案 1 :(得分:13)
他们仍然指向开始和结束。向量的那些插槽中的值可能已更改,但每个驻留的存储位置保持不变。
答案 2 :(得分:7)
std::sort
不会使向量的迭代器失效。排序模板使用迭代器上的*
运算符来访问和修改向量的内容,通过迭代器修改向量元素到向量中的元素不会使任何迭代器无效。
总之,
除了对Kirill V. Lyadvinsky(Does a vector sort invalidate iterators?)提供的标准的支持外:
如果算法的效果部分说 任何指向的值 作为参数传递的迭代器是 修改,然后该算法有一个 附加类型要求:类型 该论点应满足 可变迭代器的要求 (24.1)。
除了它的类别,前锋, 双向或随机访问 迭代器也可以是可变的 常数取决于是否 表达式的结果* i表现为 引用或作为参考 恒定。
答案 3 :(得分:1)
std::vector
将其元素保存在连续的内存中。 std::sort
按值获取参数(迭代器)并重新排列它们之间的序列。最终结果是您的本地变量start
和end
仍然指向向量的第一个和最后一个元素。