c++ - 为什么在 C++ 中对 vector 使用索引运算符被认为是不好的风格?

标签 c++ vector indexing standard-library push-back

我正在开发一个使用 vector 的程序。所以我做的第一件事就是声明我的 vector 。

std::vector<double> x;
x.reserve(10)

(顺便说一句,这也被认为是不好的做法吗?我应该只输入 std::vector<double> x(10) 吗?)

然后我开始为 vector 赋值,并询问它的大小。

for (int i=0; i<10; i++)
{
    x[i]=7.1;
}
std::cout<<x.size()<<std::endl;

我不知道它会返回 0 , 所以经过一些搜索我发现我需要使用 push_back 方法而不是索引运算符。

for (int i=0; i<10; i++)
{
    x.push_back(7.1);
}
std::cout<<x.size()<<std::endl;

现在它返回 10 .

所以我想知道的是为什么索引运算符让我访问 vector 中“存储”的值 x在给定索引处,但不会更改其大小。另外,为什么这是不好的做法?

最佳答案

当您执行 x.reserve(10) 时,您仅将容量 设置为十个元素,但大小 仍为零。

这意味着您在循环中使用索引运算符会越界(因为大小为零)并且您将有未定义的行为

如果要设置大小,请使用 resize或者在构建 vector 时简单地告诉它:

std::vector<double> x(10);

至于 vector 的容量,当您设置它时(使用例如 reserve ),它会分配(在您的情况下)十个元素所需的内存。这意味着当您执行 push_back 时,将不会重新分配 vector 数据。

如果不改变容量,或者添加超出容量的元素,那么每次push_back都可能导致 vector 数据的重新分配。

关于c++ - 为什么在 C++ 中对 vector 使用索引运算符被认为是不好的风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42675035/

相关文章:

c++ - 如何在lambda中访问捕获的此指针的 `typeid`?

c++ - C++ 核心库的编译错误

MySQL - 错误 1071、 "specified key was too long..."阻止更改字符集/归类

mysql - 为 MySQL 表建立索引以获得最佳查询的替代方法?

python - Numpy:多维数组值内的比较

c++ - 尾递归没有发生

c++ - 从 JIS X 208 到 UNICODE 的编码转换

c++ - 传递指针 vector 的指针......不不?

c++ - 寻找给定 vector 的最小值

c++ - 来自 vector 图像的 OpenGL 自动代码生成器