【问题标题】:What does std::vector's .at() function really do? [duplicate]std::vector .at() 函数的真正作用是什么? [复制]
【发布时间】:2013-08-17 08:51:57
【问题描述】:

这两种方法在向量中插入值有什么区别:

vector<int> vectorlist (12);
vectorlist[12]=23;

对比:

vector<int> vectorlist (12);
vectorlist.at(12)=23;

【问题讨论】:

  • 这些都不应该用于插入东西。在您的情况下,您只需运行代码即可看到差异(除非 UB 导致发生与其他情况完全相同的事情)。
  • 我认为第二个会抛出异常,第一个会有未定义的行为,因为向量大小是 12 个元素,而不是 13 个。也许容量会更大。
  • @IvanaGajic - 看到这个问题 regading at.

标签: c++


【解决方案1】:

.at(...) 正在做边界检查,同​​时 [] 运算符不做,即超出范围。

从这里查看文档:

http://www.cplusplus.com/reference/vector/vector/at/

"该函数自动检查n是否在向量中有效元素的范围内,如果不在则抛出out_of_range异常(即,如果n大于或等于其大小)。这与成员运算符相反[],不检查边界。”

或:

http://www.cplusplus.com/reference/vector/vector/operator[]/

“类似的成员函数 vector::at 具有与此运算符函数相同的行为,不同之处在于 vector::at 是边界检查的,并通过抛出 out_of_range 异常来指示请求的位置是否超出范围。”

有点离题,但你不应该使用“vectorlist”术语来表示向量。起初,我以为您会出于某种原因拥有一个列表数据。

所以,举一个真实世界的例子:当你确定索引在范围内时,你可以使用非边界检查变体,因为这会导致代码稍微快一点。

【讨论】:

  • +1 只是一个挑剔:cpluplus.com 网站包含很多错误,即使这个答案是正确的。更喜欢引用(免费提供的草案)标准本身,或者至少来自更好的参考网站,例如 en.cppreference.com
  • Stackoverflow 旨在给出权威答案;对于 C++,只有一个权威来源,即标准。从中获得简单 API 问题的答案真的不难。
  • 不,在这种情况下没关系。但非权威网站如 wikipedia 或 cplusplus.com 只能用于提供示例程序。
  • @TemplateRex:我的意见是我们应该解决真正的问题,而不是挑剔 1-2 并错过许多其他问题的修复。我认为他们称之为“务实”。请注意,en.cppreference.com 是否更好只是您或其他人的判断。 ;-)
【解决方案2】:

根据 C++ 标准:

一个类似的成员函数,vector::at,与这个操作符 [] 函数具有相同的行为,除了 vector::at 是边界检查的,并且如果请求的位置超出范围,则通过抛出一个 out_of_range 异常来发出信号。

【讨论】:

  • 另外,由于这个特殊原因,at[] 慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2013-01-07
相关资源
最近更新 更多