代码之家  ›  专栏  ›  技术社区  ›  avakar

重叠向量的行为::insert

  •  3
  • avakar  · 技术社区  · 16 年前

    C++标准在哪里声明一对迭代器传递给 std::vector::insert 不能重叠原始序列?

    编辑:详细说明一下,我很确定标准不需要标准库来处理这样的情况:

    std::vector<int> v(10);
    std::vector<int>::iterator first = v.begin() + 5;
    std::vector<int>::iterator last = v.begin() + 8;
    v.insert(v.begin() + 2, first, last);
    

    但是,我找不到标准中的任何内容,这将禁止范围 [first, last) [v.begin(), v.end()) 重叠。

    2 回复  |  直到 16 年前
        1
  •  7
  •   Richard Corden    16 年前

    23.1.1/4顺序要求有:

    表达式: 插入(p,i,j)

    返回类型: 无效

    先决条件: i,j不是 . 在p之前插入[i,j]中元素的副本。

    所以 i j 不能是向量的迭代器。

    这是有意义的,就像在插入操作过程中,向量可能需要调整自身的大小,因此可以首先将现有元素复制到新的内存位置(在那里通过使当前迭代器无效)。

        2
  •  3
  •   JaredPar    16 年前

    如果允许的话,考虑一下这种行为。每次插入到向量中都会将起始迭代器和结束迭代器之间的距离增加一个,并将起始迭代器向上移动一个。因此,开始迭代器永远不会到达结束迭代器,并且算法将执行,直到发生内存不足的异常。

    推荐文章