假设我有类似下面的代码:
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
s)
答案 0 :(得分:1)
是的,制作副本。见documentation for push_back
:
新元素初始化为值的副本
该功能有两个重载。在您的示例中,选择void push_back( const T& value )
重载是因为您正在传递命名对象但尚未应用std::move
,因此副本。
如果您传递了一个未命名的对象或应用了std::move
,那么将选择另一个重载,“窃取”tmp
的内容以初始化{{1}末尾的新对象} vector。
但这对你的问题甚至不重要。在任何一种情况下,vecs
生命周期结束的事实(因为它在源代码中的范围)是无关紧要的。 tmp
向量已经包含并拥有一个新元素,而vecs
所发生的事情并不是它的问题。
要记住的最重要的事情可能是C ++标准容器的设计使您可以像普通tmp
一样轻松地使用它们。您可以复制它们,返回它们,传递它们并分配它们,结果将始终如预期的那样。这是因为C ++标准容器拥有其内容。
答案 1 :(得分:0)
它的副本是否会插入到vecs向量中?
是