C++ C+中容器的范围+;

C++ C+中容器的范围+;,c++,scope,C++,Scope,假设我有如下代码: 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 =

假设我有如下代码:

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);
    }
}
intmain(){
向量vecs;
国际网络;
cin>>n_vecs;
对于(int i=0;i>n_nums;
向量tmp;
对于(int j=0;i>num;
tmp.推回(num);
}
矢量推回(tmp);
}
}
逐渐填充
向量
s的向量。从一些测试用例中,我了解到,在
for
循环完成后,向量按照预期构建。然而,我不明白为什么会这样:难道
tmp
向量不应该是 外部
for
循环完成后超出范围?是否将其副本插入
vecs
向量?(这同样适用于
map
s)

是的,复制一份。见:

新元素初始化为值的副本

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

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

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


也许最重要的是记住C++标准容器的设计,以便您可以像普通的代码> int /代码>一样容易地使用它们。您可以复制、返回、传递和分配它们,结果将始终如预期的那样。这是因为C++标准容器<强>自己< /强>它们的内容。< /P> 它的副本是否插入到vecs向量中


是。

是的,
tmp
的副本是
push_-back
ed。更准确地说,
tmp
在每次迭代中都会被构造和销毁。对于这个问题有很多否决权。发生了什么?