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

Chr*_*mer 14 c++ vector language-lawyer

这个问题使我不确定将一个向量附加到自身.所以问题是:遵循代码行做我所期望的,但它是否符合标准?

vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)

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

vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)

还是实施依赖?

tem*_*def 16

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

i,j不是迭代器a.

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

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

希望这可以帮助!