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

为什么C++ STL向量不超出范围,c++,data-structures,stl,C++,Data Structures,Stl,我有这个代码,我想知道它是如何工作的;为什么它允许我使用大于使用运算符[]的向量大小的值访问元素 但是当我使用at函数进行边界检查时,它抛出了正确的错误 我读到这样做的行为是未定义的,但我很好奇:为什么操作符[]用于超出范围的元素访问 // vector of length 3 std::vector<int> adj(3); // output: 3 printf("Size of adj is %lu\n", adj.size()); // assign using inde

我有这个代码,我想知道它是如何工作的;为什么它允许我使用大于使用运算符[]的向量大小的值访问元素

但是当我使用at函数进行边界检查时,它抛出了正确的错误

我读到这样做的行为是未定义的,但我很好奇:为什么操作符[]用于超出范围的元素访问

// 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);

出于速度原因,未检查越界。假设程序员在使用运算符[]之前知道自己在边界内


此外,未定义的行为可能会导致任何事情发生,从预期的行为到鼻腔中打开的地狱之门的崩溃。

这确实是出于设计:订阅操作符[]不会检查您是否试图越界

原因是性能。使用运算符[]与访问数组中的元素一样快。C++是围绕性能而设计的,所以这是一个非常需要的特性,对于大多数高性能域中的C++项目来说是如此。 at函数是为可以用性能换取运行时验证的项目提供的。如果你没有一个关键的更新循环通过你的向量,并且你希望你的代码在用户请求访问数据时抛出,那么使用at是很有帮助的


大多数C++用户默认情况下会与运算符[]进行匹配,并且确保通过检查不必产生无效索引,而只需使算法不可能被绑定,如只使用有效迭代器和大小< /p>,这可能是我所读过的未定义行为的最好描述。