2012-01-02 158 views
0

問題是關於循環內部的變量。它是如何工作的? 類似的問題:
one
twofor循環中的C++聲明變量

代碼:

for (i = 0 ; i < 3 ; i++) { 
    vector<int> vint; 
    vint.push_back(i); 
    cout << "vecor size is: " << vint.size() << endl; 
    for (j = 0 ; j < vint.size() ; j++) { 
     cout << "vint[" << j << "] = " << vint[j] << endl; 
    } 
} 

上面的代碼中給出了一個輸出:

vecor size is: 1 
vint[0] = 0 
vecor size is: 1 
vint[0] = 1 
vecor size is: 1 
vint[0] = 2 

它看起來像在每次迭代方法SDT結束:: vector :: erase被調用,或者某種方式vint變成空的。它是如何工作的,你是如何解決它的?謝謝!

UPDATE:
如果我想在每次迭代中什麼是更好的不同載體:
聲明VINT在循環
或在循環之前聲明,並在循環的末尾使用明確的()?

回答

2

變量在for循環構造,並在每次迭代中破壞的發言。在你的特定情況下,這將涉及每次迭代的內存分配和釋放。如果每次迭代都需要一個不同的向量,則最好在循環之前(或在循環的初始化中)聲明它,並在循環結束時(或在循環的前進中)聲明它。

0

vint在外循環的每次迭代中都被清除(整個事物,不僅僅是項)。

+0

的確如此。但這不是一個非常有用的解釋。 – 2012-01-02 20:25:40

2

你宣佈已經vint循環,所以它的壽命也正是一個迭代。在每次迭代中,構造一個新的vector,每次迭代結束時,調用其析構函數。

嘗試將vint的聲明移至循環外部。

0

那麼,你在內循環的開始每次重新申報vint。因此怪異的輸出。 使用這個代替:

vector<int> vint; 
for (i = 0 ; i < 3 ; i++) { 

    vint.push_back(i); 
    cout << "vecor size is: " << vint.size() << endl; 
    for (j = 0 ; j < vint.size() ; j++) { 
     cout << "vint[" << j << "] = " << vint[j] << endl; 
    } 
} 
0

每次外層循環迭代時,都會初始化vint,因爲它的大小保持不變。

for (i = 0 ; i < 3 ; i++) { 
     vector<int> vint;   // vint Initialization 
     vint.push_back(i); 
     cout << "vecor size is: " << vint.size() << endl; 
     for (j = 0 ; j < vint.size() ; j++) { 
      cout << "vint[" << j << "] = " << vint[j] << endl; 
     } 
    } 

,如果你寫這樣的話,那就在內環包含多個值

vector<int> vint;   // vint Initialization 
for (i = 0 ; i < 3 ; i++) { 

      vint.push_back(i); 
      cout << "vecor size is: " << vint.size() << endl; 
      for (j = 0 ; j < vint.size() ; j++) { 
       cout << "vint[" << j << "] = " << vint[j] << endl; 
      } 
     } 
0
vector<int> vint; 

正在執行每次外循環,這樣你在每個迭代上

只有一個元素