重叠向量::插入的行为
Posted
技术标签:
【中文标题】重叠向量::插入的行为【英文标题】:The behavior of overlapped vector::insert 【发布时间】:2009-08-25 15:51:39 【问题描述】: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())
重叠。
【问题讨论】:
【参考方案1】:23.1.1/4 序列要求有:
表达式: a.insert(p,i,j)
返回类型: void
前提条件: i,j 不是 a 的迭代器。在 p 之前插入元素 in[i,j) 的副本。
所以i
和j
不能成为向量的迭代器。
这是有道理的,因为在插入操作期间,向量可能需要调整自身大小,因此可能首先将现有元素复制到新的内存位置(通过使当前迭代器无效)。
【讨论】:
非常感谢,这正是我想要的。 :-) 很确定你的意思是i
和j
,而不是p
; p
必须是向量的迭代器。【参考方案2】:
如果允许,请考虑该行为。每次插入向量都会将开始和结束迭代器之间的距离增加一,并将开始迭代器向上移动一。因此,开始迭代器永远不会到达结束迭代器,并且算法将一直执行,直到发生内存不足异常。
【讨论】:
你是说标准没有明确说明这个要求? 我很快查了一下,是的,没有明确说明。 AraK,恕我直言,你怎么可能这么快就检查出来? @avakar 我刚刚检查了 23.2.4.3 矢量修饰符,没有任何关于您的问题。对不起,如果我误解了这个问题:) 如果允许,那么标准肯定会以一种不会导致无限大小的向量的方式指定它。比如说,要求它插入该迭代器范围的值,就像它们在调用时一样,而不管调用期间对该范围所做的任何更改。以上是关于重叠向量::插入的行为的主要内容,如果未能解决你的问题,请参考以下文章