[英]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.