我正在开发一个使用 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/