This question让我不确定是否向自己添加了一个向量。所以问题是:遵循代码行做我所期望的,但它是否符合标准?
vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
以下(没有reserve()
)仍然有效,是否符合标准?
vec.insert(vec.end(), vec.begin(), vec.end());
或实施取决于?
答案 0 :(得分:16)
根据C ++ 03 ISO规范(§23.1.1,表67)(和@AndyProwl在§23.2.3中提到的,C ++ 11 ISO规范的表11),作为序列要求,序列容器中的操作a.insert(p, i, j)
具有以下前提条件:
i
,j
不是a
的迭代器。
换句话说,允许序列容器安全地假设如果进行范围插入操作,则不会从原始容器上的迭代器定义该范围。
因此,如果您尝试将容器的元素插入到自身中,那么您将调用标准库函数并打破前提条件。这导致了未定义的行为,这意味着如果库实现者是好人,可能在某些平台上工作,但它可能非常灾难性地失败而没有任何理由。
希望这有帮助!