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

C++ 将std::vector附加到自身,未定义的行为?,c++,vector,language-lawyer,C++,Vector,Language Lawyer,让我不确定是否要在它自身附加一个向量。所以问题是:以下代码行符合我的预期,但它符合标准吗 vec.reserve(vec.size() * 2): vec.insert(vec.end(), vec.begin(), vec.end()); vec.insert(vec.end(), vec.begin(), vec.end()); 以下(不带reserve())仍然有效,是否符合标准 vec.reserve(vec.size() * 2): vec.insert(vec.end(), ve

让我不确定是否要在它自身附加一个向量。所以问题是:以下代码行符合我的预期,但它符合标准吗

vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
vec.insert(vec.end(), vec.begin(), vec.end());
以下(不带
reserve()
)仍然有效,是否符合标准

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

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

i
j
不是
a
的迭代器

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

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


希望这有帮助

在遍历容器时更改容器的内容(例如
std::vector
)是非常困难的。有关一致的方式,请参阅@AndyProwl-谢谢!出于好奇,有没有一种简单的方法可以获得该ISO规范的合法副本?@templatedtypdef:是的,但你必须为此付费。或者你可以从中免费获得一份草稿。@AndyProwl:这是一份非常新的草稿,在C++11之后做了大量修改。N3337更像实际的C++11标准,只做了一些小的编辑性修改。是的,这非常有帮助,感谢标准参考和解释性的文字!我确信
resize()
示例是正确的,哎哟。@Nicolas:谢谢你提供的信息。我在哪里可以找到该草案的链接?