【问题标题】:Why vector.clear() in c++ retain value in vector? [duplicate]为什么 c++ 中的 vector.clear() 在 vector 中保留值? [复制]
【发布时间】:2023-01-10 15:25:47
【问题描述】:

我发现 vector.clear() 确实保留了价值。

Vector.clear() 保留可以通过 vector[index] 访问的值。但是,如果我这样做, for(auto &i:vector) { cout <<a;} 那么,它不会透露任何值。这是什么原因?

【问题讨论】:

  • 如果您使用的索引等于或大于向量的大小,则索引超出范围并导致未定义的行为.只是不要这样做!
  • 在 C++ 中,程序编译和运行甚至似乎给出“正确”输出的事实并不意味着程序是正确的。如前所述,您访问了不再拥有的内存(并且允许其他代码覆盖它,这还没有发生纯粹是运气不好。运气不好,因为它没有表明您做错了什么)
  • “未定义的行为意味着任何事情都可能发生,包括但不限于提供预期输出的程序。但永远不要依赖具有 UB 的程序的输出。程序可能会崩溃。”

标签: c++ vector


【解决方案1】:

越界访问向量会导致未定义的行为。它可能“工作。”或者可能不是。没有保证。

来自 cppreference.com 的 operator[] documentation

笔记

std::map::operator[] 不同,此运算符从不向容器中插入新元素。通过此运算符访问不存在的元素是未定义的行为。

如果你想对 std::vector 进行边界检查,请使用 at 而不是 operator[]

【讨论】:

    【解决方案2】:

    元素已经标记正如清除的那样,这并不一定意味着它们已经消失。当您通过vec[1] 访问时,您正在进入未定义行为的领域。

    如果您要尝试 vector.at(1),您的程序将正确地引发 std::out_of_range 异常。


    您的 for (auto &amp;i : vec) 循环为空的原因是它在您的向量上调用了 .begin().end(),并且该范围为空,因为这些迭代器在 .clear() 之后是相等的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      相关资源
      最近更新 更多