2010-06-26 110 views
1

我對C++非常陌生,我試圖在C++中學習矢量..C++:遍歷矢量

我寫了如下的小程序。我喜歡的foreach如C#(在工資VAR SAL),但它不允許我這樣做,所以我用Google搜索了一下,發現我一定要使用迭代器..即時通訊能夠編譯並運行這個程序,但我不得到預期輸出..我得到 「0 0 0 0 0 0 1 2 3 4 5 6 7 8 9」 代替 「0 1 2 3 4 5 6 7 8 9」 ..

任何人都可以請解釋我爲什麼?謝謝。

#include <iostream> 
#include <iomanip> 
#include <vector> 

using namespace std; 

void show(int i) 
{ 
    cout << i << " "; 
} 

int main(){ 

    vector<int> salaries(5); 

    for(int i=0; i < 10; i++){ 
     salaries.push_back(i); 
    } 

    for_each(salaries.begin(), salaries.end(), show); 
} 

回答

9

您創建了一個矢量具有5個元素,則10個推到終點。這給你總共15個元素,以及你看到的結果。試着改變你的向量的定義(尤其是構造函數調用),你會被設定。如何:

vector<int> salaries; 
+0

嗯...只是打敗了我。 – nathan 2010-06-26 15:12:46

+0

很好..謝謝。我會將其標記爲已回答。 – 2010-06-26 15:15:32

+0

但需要等待7分鐘。再次感謝.. – 2010-06-26 15:15:55

2

當您聲明工資(5)時,它將5個條目添加到值爲0的向量中,然後您的循環將添加0..9。因此,你有你的矢量的15個元素,而不僅僅是10.嘗試宣告矢量而不5.

vector<int> salaries; 
+0

謝謝。我想將您的帖子標記爲回覆帖子,但我只能選擇一個..謝謝。 – 2010-06-26 15:18:19

+0

沒問題邁克爾,我只需要學習更快:) – nathan 2010-06-26 15:27:50

3

此代碼創建大小爲5的載體,以及與那些每5種元素的初始化爲它們的默認值(0):

vector<int> salaries(5); 

push_back插入一個新元件,所以在這裏,可以插入10個新的元件,用一個矢量具有15個元素結束了:

for(int i=0; i < 10; i++){ 
    salaries.push_back(i); 
} 

你可以像這樣,而不是創建載體:

vector<int> salaries; 

,你會得到與大小的矢量0

或者,你可以用大小爲10初始化,然後覆蓋每一個元素,而不是插入新的:

vector<int> salaries(10); 

for(int i=0; i < 10; i++){ 
    salaries[i] = i; 
} 

在某些情況下,它可能是更有效的寫是這樣的:

vector<int> salaries; // create a vector with size 0 
// allocate space for 10 entries, but while keeping a size of 0 
salaries.reserve(10); 

for(int i=0; i < 10; i++){ 
    // because we reserved space earlier, these new insertions happen without 
    // having to copy the vector contents to a larger array. 
    salaries.push_back(i); 
} 
+0

我認爲你是'resize'和'reserve'混淆。你使用'resize'的例子創建了20個元素 - 'resize'分配空間_and_創建元素。 'reserve'只是分配空間。 http://www.cplusplus.com/reference/stl/vector/resize/ – Stephen 2010-06-26 15:29:19

+0

@Stephen:呃,你當然是對的。不知道我在想什麼......我甚至在評論中寫了保留,但仍稱爲「調整大小」。現在修復,謝謝指出。 :) – jalf 2010-06-26 17:14:37

0

vector<int> salaries(5);手段,正在創建包含從一開始5個int對象,每個對象int與默認的構造初始化,並且在int構造器的情況下,設置的零值的向量。這就是爲什麼在矢量容器的開始處有5個零整數。

0

@邁克爾:這本書是什麼?我想說 這是錯的。如果事先知道 需要的矢量大小,則使用resize()是一個很好的練習 ,但除非 需要矢量包含 默認初始化值,否則 不會在創建時設置大小。

您也可以reserve陣列中的某些容量提前,這是小於不同於重新大小。只保留「至少」該向量的容量(但不會更改向量的大小),而調整大小會將\從元素中移除\以使其成爲請求的大小。

0
vector<int> salaries(5); 

這將爲其元素創建一個5個向量的向量。 [0,0,0,0,0]

for(int i=0; i < 10; i++){ 
    salaries.push_back(i); 
} 

這增加了在最後範圍從0到9 [0,0,0,0,0,0,1,2,3 10個以上的元素, 4,5,6,7,8,9]

最後,我不建議使用foreach這麼多。函數式編程有分散代碼的缺點。這是在某些情況下非常有用,但對於這些情況,並且特別是考慮到你是怎麼開始的,我建議:

for (vector<int>::const_iterator it = salaries.begin(), end = salaries.end(); it != end; ++it){ 
    salaries.push_back(i); 
} 

使用這種技術,你就可以通過任何集合中的迭代標準庫不必爲循環體編寫單獨的函數或函數對象。

用的C++ 0x,你會得到很多好吃的東西,使這個簡單:

for (int salary: salaries) 
    cout << salary << endl; 

還有BOOST_FOR_EACH已經是幾乎一樣容易,如果你可以使用提升。