c++ - vector 是否不 protected ,不会越界?

标签 c++ c++11 vector stl

我看到了this question ,并注意到一条评论说:

Maybe you go out of bounds on one of the vectors?

我不是在询问使用 [] 对超出范围的元素进行索引,这显然是超出范围的。据我所知,这不是 OP 所做的。 (我可能完全错了。)我还没有听说过使用 std::vector 越界的任何其他情况。

有人告诉我,在使用 .push_back(/*data*/) 时, vector 不会越界。由于评论者的声誉非常高,我几乎没有加倍评论来自知识的深度。该问题中的 OP 使用 .push_back(),我再次认为它是一个防止越界的 std::vector 成员函数。

关于 std::vector 有什么我应该了解的重要知识,比我更精通 C++ 的人可以解释一下吗?

最佳答案

不,它们不受保护。 C++ 使它容易是正确的:

std::vector<int> v;
for (int i : v) // cannot go out of bounds

但总的来说,它不能总是预先证明你是对的:

std::vector<int> v = something();
int i = v[v[0]]; // How would the compiler know if it's legal?

无论 v 的内容如何,​​为了保证安全,你可以这样写

int i = v.at(v.at(0)); // might throw at runtime

但由于额外的运行时检查,速度较慢。

关于c++ - vector 是否不 protected ,不会越界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37852934/

相关文章:

c++ - 何时将指向指针的指针作为参数传递给 C++ 中的函数?

matlab - 如何在matlab中将元胞数组转换为向量?

java - 如何以编程方式在 Android 中从位图创建 SVG 文件?

C++整行在不应该的时候被着色

c++ - Typedeffing 函数(不是函数指针)

c# - 将代码从 C++ 包装到 C# 时的内存管理

c++ - vector.erase() 和 remove_if() 有问题

C++11:Variadic模板函数参数包扩展执行顺序

c++ - 基于类模板的包装函数

c++ - 存储在结构中的元素是否彼此相邻