歡迎轉載,轉賬請註明原文地址:http://blog.csdn.net/majianfei1023/article/details/50001015
一、學習完iterator之後,遍歷容器我們會寫出這樣的代碼:
#include <vector>
#include <iostream>
using namespace std;
int main() {
int ia[] = {1, 2, 3};
vector<int> ivec(ia, ia + sizeof(ia) / sizeof(int));
for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
cout << *iter << endl;
}
return 0;
}
不過看到 vector<int>::const_iterator iter = ivec.begin(); 覺得,這麼一長串真的好嗎?
c++11有auto關鍵字,直接for(auto iter = iver.begin; ...)倒是方便了許多。
二、
C++ stl有一個模板函數for_each,可用於遍歷。配合function和function object(仿函數)功能強大。(不過比Python的for還是複雜了不少啊!可惜c++沒有像Python一樣簡潔的for i in list:...)
for_each用於逐個遍歷容器元素,它對迭代器區間[first,last)所指的每一個元素,執行由單參數函數對象f所定義的操作。
for_each的原型如下:
template<typename InputIterator, typename Function>
Function for_each(InputIterator beg, InputIterator end, Function f) {
while(beg != end)
f(*beg++);
}
1、最簡單的for_each配合function操作。
#include <iostream>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void print(int& elem) {
cout << elem << endl;
}
int main() {
int ia[] = {1, 2, 3};
vector<int> ivec(ia, ia + sizeof(ia) / sizeof(int));
for_each(ivec.begin(), ivec.end(), print);
}
可以把處理邏輯寫在print裏面,比如過濾,判斷,輸出等等。2、也可以配合function object進行操作:
#include <iostream>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct print{
void operator()(int elem)
{
cout << elem << endl;
}
};
int main() {
int ia[] = {1, 2, 3};
vector<int> ivec(ia, ia + sizeof(ia) / sizeof(int));
for_each(ivec.begin(), ivec.end(), print());
return 0;
}
3.c++ 11 lambda表達式大大的簡化了編寫函數的麻煩,很多簡單的操作直接可以使用匿名函數來處理。這樣for_each等模板函數用的更廣泛了。
#include <iostream>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int ia[] = {1, 2, 3};
vector<int> ivec(ia, ia + sizeof(ia) / sizeof(int));
for_each(ivec.begin(), ivec.end(), [&](int i){cout << i << endl;});
return 0;
}