为什么C ++ STL向量不会超出范围

时间:2015-01-31 20:54:59

标签: c++ data-structures stl

我有这个代码,我想知道它是如何工作的;为什么它允许我使用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);

2 个答案:

答案 0 :(得分:9)

出于速度原因,不会检查越界。假设程序员在使用operator []之前知道他在界限内。

同样,未定义的行为可能会导致任何从预期的行为中发生,甚至导致崩溃到门洞,从而打开你的鼻腔。

答案 1 :(得分:4)

这是设计确实:订阅运算符(operator[])不检查您是否尝试超出范围。

原因是表现。使用operator[]与访问数组中的元素一样快。 C ++是围绕性能设计的,因此对于高性能域中的大多数C ++项目来说,这是一项非常需要的功能。

为可以交换性能以进行运行时验证的项目提供了at函数。如果您没有通过向量的关键更新循环必须快速,并且您希望在用户确实要求访问数据超出范围时抛出代码,那么使用at()会很有帮助。

默认情况下,大多数C ++用户都会使用operator[]来提高效率,并确保不会生成无效索引(无需通过检查,只需使算法无法超出范围,例如仅使用有效的迭代器和size()