【问题标题】:C++ STL accessing vector elementC++ STL 访问向量元素
【发布时间】:2013-07-12 22:03:39
【问题描述】:

vector.at(i)vector[i] 有什么区别?

vector<int> myVector(6);
myVector.at(5) = 5;

myVector[5] = 5;

我知道两者产生相同的结果,但不知何故,运算符[] 更快。我还读到了at 检查向量大小(边界)并返回超出范围错误,而[] 没有。

但是我看到如果尝试分配:

myVector[8] = 1;

我在调试模式下遇到类似的超出范围错误。

那么at是什么意思呢?为什么它在 STL 中?

【问题讨论】:

  • 可能是在调试模式下,您的特定向量实现甚至对[] 运算符都有范围检查。您确实必须检查您正在使用的库的文档。
  • 任何参考资料都应该告诉你。如果您不相信有效性,请查看标准。

标签: c++ vector stl std


【解决方案1】:

operator [] for std::vector 将返回对内存区域的引用,无论它是否分配给向量。访问未分配的内存区域是未定义的行为,而at 将在任何情况发生之前抛出异常。正如@JoachimPileborg 在 cmets 中所说,operator [] 的未指定行为包括抛出异常。

【讨论】:

  • 补充一点,未指定的行为 包括抛出异常。
  • 谢谢,所以有一个特定的异常连接到 at()。我想我的平台支持容器“向量”的调试实现。我调试了整个过程,并在开发时查看了错误原因。在赋值之前,它也会对运算符“[]”进行边界检查。实际上,不是很多平台都在这样做吗?为什么甚至有人选择“at”,记住它的工作速度较慢?
  • @C.CanberkBacı,因为如果超出范围,即使在发布模式下,也可以保证抛出异常。取决于你的程序是什么样的,这可能是好是坏。
猜你喜欢
  • 2011-02-13
  • 2022-01-14
  • 1970-01-01
  • 2016-10-11
  • 2011-03-07
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多