15

这个问题让我不确定将向量附加到自身。所以问题是:下面的代码行符合我的期望,但它符合标准吗?

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

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

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

或实施取决于?

4

1 回答 1

17

根据 C++03 ISO 规范(第 23.1.1 节,表 67)(正如@AndyProwl 提到的,在第 23.2.3 节,C++11 ISO 规范的表 11 中),作为序列要求的一部分,序列容器中的操作a.insert(p, i, j)具有以下前提条件:

i,j不是迭代器a

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

因此,如果您尝试将容器的元素插入到自身中,您就是在调用标准库函数并破坏了先决条件。这会导致未定义的行为,这意味着如果库实现者是好人,它可能会在某些平台上工作,但它可能会在没有任何理由的情况下发生可怕的灾难性失败。

希望这可以帮助!

于 2013-02-09T22:11:19.603 回答