例如,假设我有以下代码:
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循环中自动被破坏。 为什么大的仍然可以访问正确的值?
谢谢!
答案 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
的元素。