在C ++中,何时自动为本地向量调用析构函数?

时间:2016-01-14 04:15:47

标签: c++ vector

例如,假设我有以下代码:

vector<vector<int>> big;
for (int i=0;i<3;++i){
    vector<int> small;
    small.push_back(3*i+1);
    small.push_back(3*i+2);
    small.push_back(3*i+3);
    big.push_back(small);
}
for (vector<int> s:big){
    for (int a:s){cout<<a<<" ";}
    cout<<endl;
}

cout给出的结果是big包含每个for循环中的vector小值,我很困惑因为我认为vector for small会在每个for循环中自动被破坏。 为什么大的仍然可以访问正确的值?

谢谢!

3 个答案:

答案 0 :(得分:5)

执行时:

Caman("#theCanvas", "images/1.jpg", function () {

    this.greyscale()
        .noise(33.3)
        .render(function(){
            for(i=1;i<=3;i++){
                draw(2);
                draw(3);
                draw(4);
                draw(8);
            }
            for(i=1;i<=29;i++){
                draw(1);
                draw(5);
                draw(6);
                draw(7);
            }
            var canvas = document.getElementById("theCanvas");
            canvas.toBlob(function(blob) {
                saveAs(blob, "image.jpg");
            });
        });
});

big.push_back(small); 的副本已添加到small。您可以通过执行以下操作来验证它们是两个不同的对象:

big

您还可以验证它们是否独立保存向量数据。您可以打印保存数据的指针。

std::cout << (void*)&big.back() << std::endl;  // big.back() returns a reference to the copy.
std::cout << (void*)&small << std::endl;

答案 1 :(得分:1)

那是因为你使用big.push_back(small);制作了一个小矢量的副本,当小矢量在循环结束时被销毁时副本没有受到影响

答案 2 :(得分:1)

std::vector<T>::push_back() 基于副本。它会创建参数的副本,在本例中为small,并将其存储在big中。

所以你没有看到来自small的元素,而是来自big的元素。