使用指定数量的单位化空间初始化向量

initialize an vector with a specified number of unitialized space

本文关键字:单位 空间 初始化 向量      更新时间:2023-10-16

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

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

你怎么看?"用指定数量的单位化空间初始化向量"可以实现吗?

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

初始化大小为 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()方式,而不知道以前的索引是否纵过(或者索引是否针对某些数据是固定的)。