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

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

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

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

3 回答 3

3

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

for (size_t i = vecOfVecs.size(); i < 10; ++i) {
    vecOfVecs.push_back(std::vector<int>());
}
于 2012-12-05T02:14:23.153 回答
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

于 2012-12-05T02:16:49.437 回答
1

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

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

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

您的示例完全合法:您的向量向量将包含十个空向量。

于 2012-12-05T02:10:21.730 回答