基本上我希望能够做这样的事情
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 :(得分: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()
方式随时访问已知范围内的任何索引,而不知道先前的索引是否已被操纵(或者某些数据的索引是否固定)。