簡體   English   中英

C ++:迭代向量

[英]C++ : iterating the vector

我是C ++的新手,正在嘗試學習C ++中的向量。

我寫了下面的小程序。 我喜歡像C#一樣foreach(薪水不等),但是它不允許我這樣做,所以我用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);   
}

您創建了一個包含5個元素的向量,然后將10個元素推到最后。 這樣一來,您總共可以獲得15個元素,並且看到的是結果。 嘗試更改向量的定義(尤其是構造函數調用),您將被設置。 怎么樣:

vector<int> salaries;

這段代碼創建一個大小為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); 
}

當聲明salaries(5)時,它將向向量中添加5個條目,其值為0。然后,循環將添加0..9。 因此,向量中有15個元素,而不是10個。嘗試聲明不帶5的向量。

vector<int> salaries;

vector<int> salaries(5); 就是說,您正在創建一個從頭開始包含5個int對象的向量,並且每個int對象都使用默認構造函數初始化,並且在int情況下,contructor設置了零值。 這就是為什么在向量容器的開頭有5個零整數的原因。

@Michael:那是哪本書? 我會說這是錯誤的。 如果事先知道需要向量的大小,那么使用resize()是一個好習慣,但是除非在創建向量時需要包含默認初始化的值,否則不要在創建時設置大小。

您還可以提前在陣列中保留一些與重新調整大小完全不同的容量。 保留只是簡單地“至少”為向量保留了這么多的容量(但不會更改向量的大小),而resize會向向量中添加\\ /刪除向量中的元素,以使其達到請求的大小。

vector<int> salaries(5);

這將為其元素創建一個由5個零組成的向量。 [0,0,0,0,0]

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

這會在0到9的末尾添加另外10個元素[0、0、0、0、0、0、1、2、3、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,如果您可以使用boost,它幾乎一樣容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM