2

我正在尝试有效地使用矢量。所以我先保留内存,然后使用向量。但是在我尝试使用 [] 运算符填充向量后,向量的大小保持为零。为什么会这样?

vector Vec; 
Vec.reserve(10); 
Vec[0] = 2.0; 
Vec[1] = 3.0;
...
4

5 回答 5

11

reserve()仅在后备存储中保留空间,因此后续推送的元素不必重新分配(直到您超过保留空间)。但它不会改变向量的实际大小,因此您的Vec[0] =访问实际上是在向量的末尾运行的。

你可以使用

vector Vec;
Vec.resize(10);
Vec[0] = 2.0;
Vec[1] = 3.0;

如果您愿意,大小将为 10。或者如果您希望此时大小仅为 2,但仍保留空间以避免多次重新分配,您可以使用

vector Vec;
Vec.reserve(10);
Vec.push_back(2.0);
Vec.push_back(3.0);
于 2013-02-06T19:06:10.413 回答
3

reserve()不调整向量的大小。你需要使用resize().

于 2013-02-06T19:06:00.960 回答
2

当您使用时,reserve您实际上并没有在向量中创建元素。您的作业正在访问不存在的元素。

于 2013-02-06T19:06:19.003 回答
2

std::vector 不会自动扩展。函数reserve(size)不会增加大小,它只能确保你有足够的内存用于以后的大小扩展。

所以代替非法

Vec[0] = 2.0;

尝试

Vec.push_back( 2.0 );

这将使向量大小增加 1。

顺便说一句,声明应该是

vector<double> Vec;
于 2013-02-06T19:12:11.257 回答
1

reserve对向量的大小没有影响。在我使用的大多数实现中,以下访问会导致程序终止。如果没有,您可能编译时使用了错误的选项。

您应该直接构造大小为 10 的向量:

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

如果您插入的值是常量,您可以执行以下操作:

static double initVec[] = { 2.0, 3.0 ... };
std::vector<double> vec( begin( initVec ), end( initVec ) );

,或者如果您使用的是 C++11:

std::vector<double> vec{ 2.0, 3.0 ... };

这两种方法都具有直接初始化向量中数据的优点。

于 2013-02-06T19:21:30.897 回答