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

时间:2013-02-09 21:49:52

标签: c++ vector language-lawyer

This question让我不确定是否向自己添加了一个向量。所以问题是:遵循代码行做我所期望的,但它是否符合标准?

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

以下(没有reserve())仍然有效,是否符合标准?

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

或实施取决于?

1 个答案:

答案 0 :(得分:16)

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

  

ij不是a的迭代器。

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

因此,如果您尝试将容器的元素插入到自身中,那么您将调用标准库函数并打破前提条件。这导致了未定义的行为,这意味着如果库实现者是好人,可能在某些平台上工作,但它可能非常灾难性地失败而没有任何理由。

希望这有帮助!