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())
重叠。
答案 0 :(得分:7)
23.1.1 / 4序列要求有:
表达式: a.insert(p,i,j)
返回类型: void
前提条件: i,j不是的迭代器。在p。
之前插入[i,j]中的元素副本因此i
和j
不能成为向量中的迭代器。
有意义的是,在插入操作期间,向量可能需要调整自身大小,因此现有元素可能首先被复制到新的内存位置(通过使当前迭代器无效)。
答案 1 :(得分:3)
考虑允许的行为。向量中的每个插入都会将开始和结束迭代器之间的距离增加一,并将启动迭代器向上移动一个。因此,启动迭代器永远不会到达结束迭代器,算法将执行,直到发生内存不足异常。