C++ for_each學習筆記

歡迎轉載,轉賬請註明原文地址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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章