【发布时间】:2018-01-12 09:44:47
【问题描述】:
我不明白我的程序中函数 size() 和 resize() 的下一个行为。
我创建了一个包含 3 个元素的结构向量。
在代码的最后一部分,我使用了函数 resize() 以便只有 2 个元素。然后我再次为 3 个元素赋值,得到一个 3 元素向量。
在最后一部分中,我可以调用向量 vector_a 的 3 个元素,所以我知道我有一个 3 元素向量,但是函数 size() 给我的输出是我有 2 个元素。
// Example program
#include <iostream>
#include <vector>
int main()
{
struct struct_1
{
int variable_1;
int variable_2;
};
std::vector<struct_1> vector_a;
vector_a.push_back(struct_1());
vector_a.push_back(struct_1());
vector_a.push_back(struct_1());
vector_a.resize(2);
vector_a[0].variable_1 = 21;
vector_a[0].variable_2 = 34;
vector_a[1].variable_1 = 111;
vector_a[1].variable_2 = 764;
vector_a[2].variable_1 = 5656;
vector_a[2].variable_2 = 5666764;
std::cout << "size " << vector_a.size() << std::endl;
}
我错过了什么?
【问题讨论】:
-
使用
operator[]的索引没有边界检查。如果您想要边界检查,请使用at。你有向量中有两个元素,这就是resize调用所做的。 -
“在最后一部分中,我可以调用向量 vector_a 的 3 个元素,所以我知道我有一个 3 元素向量” 不,只是因为编译器没有阻止你做某事并不意味着这件事可以做。 C++ 不会主动保护每个人免受所有错误的影响,因为对于已经知道如何避免这些错误的人来说,这会导致代码变得毫无意义地变慢。