【问题标题】:Appending std::vector to itself, undefined behavior?将 std::vector 附加到自身,未定义的行为?
【发布时间】:2013-01-25 08:45:26
【问题描述】:

This question 让我不确定将向量附加到自身。所以问题是:以下代码行符合我的预期,但是否符合标准?

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

以下(没有reserve())仍然有效,它甚至符合标准吗?

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

还是取决于实现?

【问题讨论】:

标签: c++ vector language-lawyer


【解决方案1】:

根据 C++03 ISO 规范(第 23.1.1 节,表 67)(正如@AndyProwl 在第 23.2.3 节中提到的,C++11 ISO 规范的表 11),作为序列要求,序列容器中的操作a.insert(p, i, j)有这个前提:

ij 不是a 的迭代器。

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

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

希望这会有所帮助!

【讨论】:

  • @AndyProwl- 谢谢!出于好奇,是否有一种简单的方法可以获得该 ISO 规范的合法副本?
  • @templatedtypdef:是的,但您必须为此付费。或者您可以从here 免费获取草稿。
  • @AndyProwl:这是一个非常新的草案,在 C++11 之后进行了大量更改。 N3337 更像是实际的 C++11 标准,只有少量的编辑更改。
  • 是的,这很有帮助,感谢您的标准参考和解释性文字!我很确定resize() 的例子是正确的,哎哟。
  • @NicolBolas:感谢您提供的信息。在哪里可以找到该草稿的链接?
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2021-12-07
  • 2016-09-01
相关资源
最近更新 更多