追加的std ::载体本身,不确定的行为?(Appending std::vector to its

2019-07-19 15:57发布

这个问题让我不确定追加一个载体本身。 所以,问题是:代码以下行做什么,我期待的,但它是符合标准的?

vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());

以下(不含reserve()仍然有效,是它甚至符合标准?

vec.insert(vec.end(), vec.begin(), vec.end());

或实现取决于?

Answer 1:

根据C ++ 03 ISO规格(§23.1.1,表67)(和如@AndyProwl,在§23.2.3中,C ++ 11 ISO规格的表11已经提到的),作为其一部分序列的要求,操作a.insert(p, i, j)序列中的容器具有这样的先决条件:

ij不是迭代器a

换句话说,序列容器被允许安全地假设,如果你做了一系列插入操作,该范围不会从迭代器在该原始容器中定义。

其结果是,如果你尝试插入容器的元素融入自身,要调用标准库函数和突破的先决条件。 这将导致不确定的行为,这意味着它可能在某些平台上工作,如果库的实现很不错的人,但也可能非常灾难性的和失败,没有理由。

希望这可以帮助!



文章来源: Appending std::vector to itself, undefined behavior?