at()
比[]
慢,因为它需要进行边界检查,这也在类似的问题中讨论过,比如C++ Vector at/[] operator speed或::std::vector::at() vs operator[] << surprising results!! 5 to 10 times slower/faster!。我只是不明白at()
方法有什么用处。如果我有一个简单的向量,像这样:
std::vector<int> v(10);
,并且我决定在索引i
可能超出向量边界的情况下,使用at()
来访问其元素,它会强制我用try-catch块包裹它:try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
虽然我可以通过使用
size()
并自己检查索引来实现相同的行为,这对我来说似乎更简单和方便。if (i < v.size())
v[i] = 2;
所以我的问题是:
使用vector::at相比vector::operator[]有哪些优势?
什么时候应该使用vector::at而不是vector::size + vector::operator[]?
if (i < v.size()) v[i] = 2;
存在一种可能的代码路径,它根本不会将2
分配给v
的任何元素。如果这是正确的行为,那很好。但通常情况下,当i >= v.size()
时,此函数无法执行任何有意义的操作。因此,使用异常来指示意外情况并没有任何特定的原因。许多函数仅使用operator[]
而没有检查大小,并记录必须在范围内的i
,并将由此导致的未定义行为归咎于调用方。 - Steve Jessopat
更加安全。例如,给定一个包含 100 个元素的obj
向量。obj.at(143) = 69;
会立即引发错误。然而,obj[143] = 69;
将悄无声息地偷偷摸摸地改变数值,你可能察觉不到。 - daparic