重叠向量::插入的行为

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) 的副本。

所以ij 不能成为向量的迭代器。

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

【讨论】:

非常感谢,这正是我想要的。 :-) 很确定你的意思是ij,而不是pp 必须是向量的迭代器。【参考方案2】:

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

【讨论】:

你是说标准没有明确说明这个要求? 我很快查了一下,是的,没有明确说明。 AraK,恕我直言,你怎么可能这么快就检查出来? @avakar 我刚刚检查了 23.2.4.3 矢量修饰符,没有任何关于您的问题。对不起,如果我误解了这个问题:) 如果允许,那么标准肯定会以一种不会导致无限大小的向量的方式指定它。比如说,要求它插入该迭代器范围的值,就像它们在调用时一样,而不管调用期间对该范围所做的任何更改。

以上是关于重叠向量::插入的行为的主要内容,如果未能解决你的问题,请参考以下文章

matlab:将向量划分为固定大小的重叠块

使用带有 ggplot 的两个不同向量创建重叠直方图

Leetcode:835. 图像重叠

如何在具有丰富数据的表上进行 PCA,但将其与 R 中站点的环境参数向量重叠?

在 2 列表中插入非重叠范围

怎样判断平面上一个矩形和一个圆形是否有重叠