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)