2013-11-14 176 views
1

基本上我想能够做这样的事初始化向量用的未初始化空间中指定数量的

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赋给initliazed向量是不必要的。

你觉得呢?是“初始化一个具有指定数量的单位空间的向量”是否可以实现?

回答

4

问题是,您正在创建一个带有三个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的调用具有为三个元素分配足够空间的效果,无需初始化任何元素。

+0

感谢,bascially是我想要的,但看起来像这不能在一行代码中实现。 – KKKoo0

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()方式先前的指数是否被操纵(或者如果指数对于某些数据是固定的)。