调用 clear() 后,vector 的元素仍然可以引用吗?

Posted

技术标签:

【中文标题】调用 clear() 后,vector 的元素仍然可以引用吗?【英文标题】:Elements of vector still reference-able after calling clear( )? 【发布时间】:2019-02-26 13:16:16 【问题描述】:

在以下代码中,我在调用内置向量的 clear( ) 方法之前和之后打印向量的第一个元素及其大小。

但是,即使在调用 clear() 之后,我仍然可以引用向量的元素(尽管大小被重置为 '0')。

这是预期的行为还是我没有很好地理解 clear( ) 的行为?

代码:

#include <vector>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
  vector<int> vec = 1, 2, 3, 4, 5;

  cout << vec[0] << " " << vec.size() << endl;

  vec.clear();

  for(auto i : vec)
    cout << i << " ";
  cout << endl;

  cout << vec[0] << " " << vec.size() << endl;
  return 0;

输出:

1 5

1 0

【问题讨论】:

访问大小为 0 的向量的第 0 个元素只是未定义的行为。 感谢您的澄清。这是有道理的。 【参考方案1】:

std::vector&lt;&gt; 的索引运算符检查索引。由于它是未定义的行为,您可能会得到“以前的情况”,或者它可能会崩溃(或“任何情况”)。

您有at 成员函数,如果索引超出范围,它将抛出。那就是:

cout << vec.at(0) << " " << vec.size() << endl;

您的main() 将在接近尾声时抛出。

【讨论】:

是的,我尝试了 at() 成员函数,但它确实引发了异常,所以看起来使用 at() 成员更好地编写安全代码。感谢您的澄清。

以上是关于调用 clear() 后,vector 的元素仍然可以引用吗?的主要内容,如果未能解决你的问题,请参考以下文章

vector.clear()后程序崩毁原因分析(单例与智能指针)

为啥 vector::clear 不从向量中删除元素?

为啥调用 std:map:clear 后内存占用率没有降低

C++ vector::clear() - 破坏顺序? [复制]

Vector清空数据与释放内存(.clear与.swap的区别与使用)

当我完成向量时,是否需要调用clear()? [重复]