vector中[]和at访问区别
# vector中[]和at访问区别
Created: March 19, 2024 11:46 AM
在C++中,std::vector提供了两种访问元素的方法:operator[]和at()。这两种方法都可以用来访问或修改容器中的元素,但它们在安全性和性能方面存在差异:
# operator[](下标运算符)
性能:**
operator[]**提供快速访问,因为它直接访问指定索引处的元素,没有进行任何边界检查。安全性:由于不进行边界检查,如果使用无效的索引访问元素,会导致未定义行为,可能包括访问无效内存,这可能引起程序崩溃或其他安全问题。
用法示例:
cppCopy code std::vector<int> v = {1, 2, 3}; std::cout << v[1]; // 输出: 2 v[1] = 20; // 修改元素1
2
3
4
5
# at() 方法
性能:**
at()方法提供边界检查,如果尝试访问超出有效索引范围的元素,会抛出std::out_of_range异常。这个附加的边界检查使得at()比operator[]**慢一些,但通常这个性能差异非常小,除非在非常性能敏感的代码中。安全性:由于**
at()在索引无效时会抛出异常,它提供了更高的安全性。这使得at()**成为在不确定索引是否有效时的首选方法。用法示例:
cppCopy code std::vector<int> v = {1, 2, 3}; try { std::cout << v.at(2); // 输出: 3 v.at(2) = 30; // 修改元素 std::cout << v.at(10); // 这会抛出std::out_of_range异常 } catch (const std::out_of_range& e) { std::cerr << "Error: " << e.what() << '\n'; }1
2
3
4
5
6
7
8
9
10
# 总结
- 使用**
operator[]**时,你需要自己确保索引的有效性,它适用于性能关键的场景或当你确信索引一定在有效范围内时。 - **
at()**更适合用在可能存在索引越界风险的场景,或者当程序的健壮性和安全性比绩效更重要时。
选择哪一种方法取决于具体的使用场景和对性能与安全性的需求。
编辑 (opens new window)