考慮下面的需求,對vector<int>中的每個元素加1,如何做?
1 void add(int& lhs) // 注意:要修改主調方法中的數據,這里要使用引用
2 { 3 lhs= lhs + 1; 4 } 5 int intArray[] = {1,2,3,4,5}; 6 vector<int> intVector(intArray,intArray+5);
1、最原始的做法:
1 for(vector<int>::iterator iter=intVector.begin();iter!=intVector.end();iter++) 2 { 3 add(*iter); 4 }
2、使用類似boost中的foreach
1 // 注意:要修改intVector中的元素,這里要使用引用,遍歷intVector的元素,用每個元素初始化引用a 2 // 因為這種情況下,遍歷intVector的時候,是間接地使用intVector中的元素。
3 BOOST_FOREACH(int& a,intVector) 4 { 5 add(a); 6 }
3、使用for_each
1 for_each(intVector.begin(),intVector.end(),add);
for_each表達的意義是對intVector的每個元素執行add方法,用(*iter)初始化add的形參。
考慮下面的需求,對vector<int>中的每個元素加一個變量,如何做?
1 void add(int& lhs,int rhs) 2 { 3 lhs= lhs + rhs; 4 }
對於第一種方法和第二種方法,很簡單,直接使用對應的方法就行了。對於第三種方法怎么辦呢?
也就是說,如何把變量傳給形參rhs?
考慮 for_each(intVector.begin(),intVector.end(),add); 實際上等價於
for_each(intVector.begin(),intVector.end(),boost::bind(add,_1));
因此,對於這種需求,就是 for_each(intVector.begin(),intVector.end(),boost::bind(add,_1,100));
注:需包含 #include<algorithm>才能使用for_each.