【问题标题】:Does a vector sort invalidate iterators?向量排序是否会使迭代器无效?
【发布时间】:2011-04-22 13:52:46
【问题描述】:
 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?

【问题讨论】:

  • 我认为应该是std::vector&lt;string&gt;::iterator start?
  • 即使这是真的,追随你的开发者也会浪费一天的时间来证明这是他正在修复的一些错误的根本原因......
  • @Ben,谢谢,抱歉复制粘贴邪恶!
  • 只是为了记录,您在这里寻找的词是“无效”。 :)
  • 为什么是哈哈哈?我只是想您可能想知道,因为它使将来谷歌搜索变得更加容易。 (迭代器失效是大多数 C++ 程序员都熟悉的术语,虽然大多数人可能会猜到您所说的迭代器“被破坏”是什么意思,但它可能不会在 Google 中产生那么多的搜索结果。)

标签: c++ sorting stl


【解决方案1】:

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

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

第 25.3 节“排序和相关操作”未指定迭代器将失效,因此问题中的迭代器应保持有效。

【讨论】:

    【解决方案2】:

    它们仍然指向开始和结束。向量的这些槽中的值可能已经改变,但每个所在的存储位置保持不变。

    【讨论】:

      【解决方案3】:

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

      总之,

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

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

      • 25/5“算法库”

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

      • 24.1/4 “迭代器要求”

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-06-16
          • 2010-12-10
          • 1970-01-01
          • 1970-01-01
          • 2012-08-09
          • 2011-05-06
          • 1970-01-01
          • 2015-07-31
          相关资源
          最近更新 更多