重叠的vector :: insert的行为

时间:2009-08-25 15:51:40

标签: c++ vector

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 个答案:

答案 0 :(得分:7)

23.1.1 / 4序列要求有:

表达式: a.insert(p,i,j)

返回类型: void

前提条件: i,j不是的迭代器。在p。

之前插入[i,j]中的元素副本

因此ij不能成为向量中的迭代器。

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

答案 1 :(得分:3)

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