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