![](/img/trans.png)
[英]C++ STL set_union gets error vector iterator + offset out of range
[英]Why C++ STL vector does not go out of range
我有这段代码,我想知道它是如何工作的。 为什么它允许我使用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);
出于速度原因,不会检查越界。 假定程序员在使用operator []之前就知道自己已处于极限。
同样,未定义的行为也可能导致任何事情从预期的行为发生变化,甚至崩溃,甚至导致您的鼻腔开口进入地狱。
实际上,这是设计使然:订阅运算符( operator[]
)不会检查您是否尝试越界。
原因是性能。 使用operator[]
与访问数组中的元素一样快。 C ++是围绕性能而设计的,因此对于高性能域中的大多数C ++项目而言,这是至关重要的功能。
为可以在运行时验证中牺牲性能的项目提供了at
函数。 如果没有遍历向量的关键更新循环,该循环必须很快,并且如果用户确实要求访问数据时希望让代码抛出,那么使用at()
会很有帮助。
默认情况下,大多数C ++用户都会使用operator[]
来提高效率,并确保不会产生无效索引(通过检查不是必须的,而只是通过使算法不可能越界就可以了,就像仅使用有效的迭代器和size()
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.