2016-01-14 41 views
0

例如,假設我有以下代碼:在C++中,什麼時候析構函數自動爲局部向量調用?

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給人造成那麼大包含了分別用於閉環矢量值小,我很困惑,因爲我以爲矢量小會自動被破壞每個循環。 爲什麼大牌仍然有權訪問正確的價值?

謝謝!

+5

它*被*破壞,但是當你將它推向大矢量時,它被*複製*。 –

+3

然後,當你說'for(vector s:big)'時,它會被再次複製。可能與這個問題不相關,但最好避免一般。首選'for(auto&s:big)'。 – 5gon12eder

回答

5

當你執行:

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; 

您也可以驗證他們獨立地保持矢量數據。您可以打印保存數據的指針。

std::cout << (void*)big.back().data() << std::endl; 
std::cout << (void*)small.data() << std::endl; 
1

那是因爲你使用big.push_back(small);這讓小載體,當小載體在循環中的副本不受影響年底被摧毀的副本

1

std::vector<T>::push_back()是基於複製。它會創建一個參數的副本,在本例中爲small,並將其存儲在big中。

所以你實際上沒有看到small的元素,而是從big

相關問題