当我调整此向量(向量)的大小时会发生什么

时间:2012-12-05 02:07:04

标签: c++ vector

std::vector<std::vector<int>> vecOfVecs;
vecOfVecs.resize(10);

vecOfVecs的0-9位置是什么? std :: vector的实例?

如果是的话,这是合法的吗?

std::vector<int> *pToVec = &(vecOfVecs[0]);
pToVec->push_back(10);

3 个答案:

答案 0 :(得分:3)

是的,位置0-9将是std::vector<int>的空实例,就像你说过

一样
for (size_t i = vecOfVecs.size(); i < 10; ++i) {
    vecOfVecs.push_back(std::vector<int>());
}

答案 1 :(得分:2)

C ++ 03中std::vector::resize的“规范”定义实际上有两个参数,而不是一个,第二个参数是用作“填充值”的元素值“为新创造的元素。第二个参数的默认参数等于元素类型的值初始化对象。这意味着你的电话

vecOfVecs.resize(10);

实际上已翻译成

vecOfVecs.resize(10, std::vector<int>());

呼叫。即它实际上是你隐式提供了一个默认构造的std::vector<int>实例,用作所有新元素的初始化器。

您的pToVec->push_back(10)电话完全合法。

C ++ 11对resize的定义进行了一些微不足道的修改(在此上下文中),但总体效果保持不变:新元素为您进行了值初始化。它们可以在调用resize后立即使用。

答案 2 :(得分:1)

默认的第二个参数resize告诉您要插入额外空间的值。如果未指定该值,则使用默认构造的值。

void resize (size_type n, value_type val = value_type());
  

如果n大于当前容器大小,则通过在最后插入所需数量的元素来扩展内容,以达到n的大小。如果指定了val,则新元素将初始化为val的副本,否则,它们将进行值初始化。

你的例子是完全合法的:你的向量向量将包含十个空向量。