当我调整这个矢量(矢量)的大小时会发生什么

What happens when I resize this vector (of vectors)

本文关键字:小时 什么 矢量 调整      更新时间:2023-10-16
std::vector<std::vector<int>> vecOfVecs;
vecOfVecs.resize(10);

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

如果是这样,这是否合法:

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

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

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

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后立即使用。

有一个默认的第二个参数 resize,它告诉您要将哪个值插入到附加空间中。如果未指定该值,则改用默认构造的值。

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

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

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