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 分配给初始化向量是不必要的。

你怎么看?是否可以实现“使用指定数量的未初始化空间初始化向量”?

4

2 回答 2

6

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

于 2013-11-14T14:11:01.690 回答
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()被操纵了(或者如果索引对于某些数据是固定的)。

于 2013-11-14T14:32:11.133 回答