初始化具有指定数量的未初始化空间的向量

时间:2013-11-14 14:09:51

标签: c++ vector initialization

基本上我希望能够做这样的事情

std::vector<int> myInts(3); 
myInts.push_back(1);
myInts.push_back(2);
myInts.push_back(3);

从概念上讲,我希望向量myInts只有3个空格,其值为{1,2,3}

显然,如果你在C ++中运行上面的代码,结果将是{0,0,0,1,2,3}

C ++的主要目标之一是效率,但在我看来,在第一行代码中,不需要为初始化向量赋值0。

你怎么看?是“可以实现具有指定数量的单位化空间的初始化”吗?

2 个答案:

答案 0 :(得分:5)

问题在于您正在创建一个包含三个0的向量,然后再推回另外三个元素。要实例化值为1,2和3的向量,可以执行以下操作:

std::vector<int> myInts{1,2,3};

或者,您可以实例化一个空向量,调用reserve以避免重新分配,然后回推值:

std::vector<int> myInts;
myInts.reserve(3); 
myInts.push_back(1);
myInts.push_back(2);
myInts.push_back(3);

reserve的调用具有为三个元素分配足够空间的效果,而无需初始化任何元素。

答案 1 :(得分:0)

您初始化大小为3的向量,然后再添加3个条目。

正如juanchopanza回答的那样,一种方法是为矢量保留空间,该矢量尚未创建矢量条目。因此,您无法访问任何保留但未添加的条目。

std::vector<int> myInts;
myInts.reserve(3); 
std::cout << myInts.at(1) << std::endl

应该抛出'std :: out_of_range'

另一种方式可能是创建(或调整大小)具有给定数量元素的向量,并根据您的意愿更改所需条目:

std::vector<int> myInts(3); 
myInts[0] = 1;
myInts[1] = 2;
myInts[2] = 3;

您应该选择哪种方式取决于您想要使用矢量的方式。如果你想使用.push_back()例如因为你不知道最后一个被操纵的索引,那么当你想要.reserve()方式使用时,你需要resize()方式随时访问已知范围内的任何索引,而不知道先前的索引是否已被操纵(或者某些数据的索引是否固定)。