C++中容器的范围

Scope for containers in C++

本文关键字:范围 C++      更新时间:2023-10-16

假设我有一段类似于以下代码的内容:

int main() {
vector< vector<int> > vecs;
int n_vecs;
cin >> n_vecs;
for (int i = 0; i < n_vecs; i++) {
int n_nums;
cin >> n_nums;
vector<int> tmp;
for (int j = 0; i < n_nums; i++) {
int num;
cin >> num;
tmp.push_back(num);
}
vecs.push_back(tmp);
}
}

逐渐填充vector<int>s 的向量。从一些测试用例中,我了解到在for循环完成后,向量是按预期构造的。但是,我不明白为什么会这样:tmp向量不应该是 外部for循环完成后超出范围?它的副本是否会插入到vecs向量中?(这同样适用于map秒)

是的,制作了一份副本。有关push_back,请参阅文档:

新元素初始化为值的副本

该函数有两个重载。在您的示例中,选择void push_back( const T& value )重载是因为您正在传递一个命名对象并且尚未应用std::move,因此需要复制。

如果您传递了一个未命名的对象或应用了std::move,则将选择另一个重载,"窃取"tmp的内容以在vecs向量末尾初始化新对象。

但这甚至对你的问题无关紧要。无论哪种情况,tmp的生命周期在之后结束(因为它在源代码中的范围)这一事实都是无关紧要的。vecs向量已经包含并拥有一个新元素,tmp发生的事情与它无关。


也许要记住的最重要的事情是,C++标准容器的设计使您可以像普通int一样轻松地使用它们。您可以复制它们,返回它们,传递它们并分配它们,结果将始终符合预期。这是因为C++标准容器拥有其内容。

它的副本是否入到 vecs 向量中?

是的。