C ++中容器的范围

时间:2017-03-25 14:22:16

标签: 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 = 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)

2 个答案:

答案 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向量中?