我正在努力有效地使用矢量。所以我先保留内存,然后使用向量。但是在我尝试使用[]运算符填充向量后,向量的大小保持为零。为什么会这样?
vector Vec;
Vec.reserve(10);
Vec[0] = 2.0;
Vec[1] = 3.0;
...
答案 0 :(得分: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);
答案 1 :(得分:3)
reserve()
不会调整矢量大小。您需要使用resize()
。
答案 2 :(得分:2)
使用reserve
时,实际上并没有在向量中创建元素。您的作业正在访问不存在的元素。
答案 3 :(得分:2)
std :: vector不会自动展开。功能保留(大小)不会增加大小,它只能确保您有足够的内存用于以后的大小扩展。
所以不是非法的
Vec[0] = 2.0;
尝试
Vec.push_back( 2.0 );
这会将矢量大小增加1。
顺便说一句,声明应该是
vector<double> Vec;
答案 4 :(得分: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 ... };
这两种方法都具有初始化的优点 矢量中的数据直接。