我有这个代码,我想知道它是如何工作的;为什么它允许我使用operator[]
使用大于向量大小的值来访问元素?
但是当我使用at()
函数进行边界检查时,它会抛出正确的错误。
我读到这样做的行为是undefined
,但我很好奇:为什么operator[]
适用于超出范围的元素访问?
// vector of length 3
std::vector<int> adj(3);
// output: 3
printf("Size of adj is %lu\n", adj.size());
// assign using index that is larger than vector size, e.g., 12
adj[12] = 314159;
// succeeds, output: 314159
printf("adj[12] is %d", adj[12]);
// fails, throws out_of_range
adj.at(12);
答案 0 :(得分:9)
出于速度原因,不会检查越界。假设程序员在使用operator []之前知道他在界限内。
同样,未定义的行为可能会导致任何从预期的行为中发生,甚至导致崩溃到门洞,从而打开你的鼻腔。
答案 1 :(得分:4)
这是设计确实:订阅运算符(operator[]
)不检查您是否尝试超出范围。
原因是表现。使用operator[]
与访问数组中的元素一样快。 C ++是围绕性能设计的,因此对于高性能域中的大多数C ++项目来说,这是一项非常需要的功能。
为可以交换性能以进行运行时验证的项目提供了at
函数。如果您没有通过向量的关键更新循环必须快速,并且您希望在用户确实要求访问数据超出范围时抛出代码,那么使用at()
会很有帮助。
默认情况下,大多数C ++用户都会使用operator[]
来提高效率,并确保不会生成无效索引(无需通过检查,只需使算法无法超出范围,例如仅使用有效的迭代器和size()
)