代码之家  ›  专栏  ›  技术社区  ›  Ramadheer Singh

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

  •  23
  • Ramadheer Singh  · 技术社区  · 14 年前
     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 回复  |  直到 14 年前
        1
  •  20
  •   Kirill V. Lyadvinsky    14 年前

    根据C++标准PAR.23.1/11:

    除非另有规定 (显式地或通过用其他函数定义函数),调用 容器成员函数或将容器作为参数传递给 图书馆功能不得失效。 迭代器 到或更改该容器中对象的值。

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

        2
  •  13
  •   Jerry Coffin    14 年前

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

        3
  •  7
  •   Community CDub    8 年前

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

    综上所述,

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

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

    • 25/5“算法库”

    如果算法的“效果”部分显示 任何人所指的价值 作为参数传递的迭代器是 修改后,该算法 附加类型要求:类型 这一论点应满足 可变迭代器的要求 (24.1)。

    • 24.1/4“迭代器要求”

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

        4
  •  1
  •   Nikolai Fetissov    14 年前

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