c++ - vector::at 与 vector::operator[]

标签 c++ stl stdvector

我知道 at()[] 慢因为它的边界检查,在类似的问题中也有讨论,如 C++ Vector at/[] operator speed::std::vector::at() vs operator[] << surprising results!! 5 to 10 times slower/faster! .我只是不明白 at() 是什么方法很好。

如果我有一个像这样的简单 vector :std::vector<int> v(10);我决定使用 at() 访问它的元素而不是 []在我有索引 i 的情况下而且我不确定它是否在 vector 范围内,它迫使我用 try-catch block 包装它:

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[] ?

最佳答案

我会说 vector::at() 抛出的异常并不是真正打算被直接周围的代码捕获。它们主要用于捕获代码中的错误。如果您需要在运行时进行边界检查,例如索引来自用户输入,您确实最好使用 if 语句。所以总而言之,设计你的代码的意图是 vector::at() 永远不会抛出异常,这样如果它抛出异常,并且你的程序中止,那就是一个错误的迹象。 (就像一个 assert())

关于c++ - vector::at 与 vector::operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9376049/

相关文章:

c++ - 在 C++ 范围内快速设置 map 中的值

c++ - 进行测试和变异函数的STL算法

c++ - 如何根据 Wavefront (.obj) 文件中给定的纹理索引对纹理位置进行排序?

c++ - 如何从 fork 中检索类的实例?

c++ - 将前 n 个质数保存在数组中而不覆盖它

c++ - std::list.remove 调用析构函数但不删除它

c++ - 如何选择特定的函数重载?

c++ - MS concurrency::parallel_for() 单次迭代的性能

c++ - 为什么 std::iterator 不包含 std::prev() 作为成员函数?

c++ - 在插入时保持 std vector/列表排序,或对所有排序