关于c ++:将std :: vector附加到自身,未定义的行为?

Appending std::vector to itself, undefined behavior?

这个问题使我无法确定是否要在其自身附加向量。所以问题是:下面的代码行可以做我所期望的,但是它符合标准吗?

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

跟随(没有reserve()仍然有效,它甚至符合标准吗?

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

还是实施取决于?


根据C++ 03 ISO规范(以及表67所示)(如AndyProwl所提到的,在C++ 11规范中的表11中),作为序列需求的一部分,序列容器中的操作0:

i, j are not iterators into a.

换句话说,序列容器可以安全地假定,如果您执行范围插入操作,则不会从该原始容器上的迭代器定义该范围。

因此,如果试图将容器的元素插入到自身中,则会调用标准库函数并破坏前提条件。这会导致未定义的行为,也就是说,如果库实现者是好人,那么它可能在某些平台上工作,但如果没有正当理由,它可能会严重而灾难性地失败。

希望这有帮助!