这个问题让我不确定将向量附加到自身。所以问题是:下面的代码行符合我的期望,但它符合标准吗?
vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
跟随(没有reserve()
)仍然有效,它甚至符合标准吗?
vec.insert(vec.end(), vec.begin(), vec.end());
或实施取决于?
这个问题让我不确定将向量附加到自身。所以问题是:下面的代码行符合我的期望,但它符合标准吗?
vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
跟随(没有reserve()
)仍然有效,它甚至符合标准吗?
vec.insert(vec.end(), vec.begin(), vec.end());
或实施取决于?
根据 C++03 ISO 规范(第 23.1.1 节,表 67)(正如@AndyProwl 提到的,在第 23.2.3 节,C++11 ISO 规范的表 11 中),作为序列要求的一部分,序列容器中的操作a.insert(p, i, j)
具有以下前提条件:
i
,j
不是迭代器a
。
换句话说,允许序列容器安全地假设,如果您执行范围插入操作,则该范围将不会从该原始容器上的迭代器中定义。
因此,如果您尝试将容器的元素插入到自身中,您就是在调用标准库函数并破坏了先决条件。这会导致未定义的行为,这意味着如果库实现者是好人,它可能会在某些平台上工作,但它可能会在没有任何理由的情况下发生可怕的灾难性失败。
希望这可以帮助!