繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM