c++中的 for_each 函式
阿新 • • 發佈:2020-08-20
1. c++中的 for_each 函式
for_each()事實上是個 function template,其原始碼如下
link:http://www.cplusplus.com/reference/algorithm/for_each/?kw=for_each
template<typename InputIterator, typename Function> Function for_each(InputIterator beg, InputIterator end, Function f) { while(beg != end) f(*beg++); } 能看懂吧!!!
例如:
// for_each example #include <iostream> // std::cout #include <algorithm> // std::for_each #include <vector> // std::vector void myfunction (int i) { // function: std::cout << ' ' << i; } struct myclass { // function object type: void operator() (int i) {std::cout << ' ' << i;} } myobject; int main () { std::vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); std::cout << "myvector contains:"; for_each (myvector.begin(), myvector.end(), myfunction); std::cout << '\n'; // or: std::cout << "myvector contains:"; for_each (myvector.begin(), myvector.end(), myobject); std::cout << '\n'; return 0; } 結果: myvector contains: 10 20 30 myvector contains: 10 20 30
foreach其他用法:https://www.cnblogs.com/zhangkele/p/9373063.html
2. C++11之for迴圈的新用法
C++使用如下方法遍歷一個容器:
遍歷vector容器 #include<iostream> #include<vector> int main() { std::vector<int> arr; arr.push_back(1); arr.push_back(2); for (auto it = arr.begin(); it != arr.end(); it++) { std::cout << *it << std::endl; } return 0; }
其中auto用到了C++11的型別推導。同時我們也可以使用std::for_each完成同樣的功能:
#include<algorithm>
#include<iostream>
#include<vector>
void func(int n)
{
std::cout << n << std::endl;
}
int main()
{
std::vector<int> arr;
arr.push_back(1);
arr.push_back(2);
std::for_each(arr.begin(), arr.end(), func);
return 0;
}
現在C++11的for迴圈有了一種新的用法:
#include<iostream>
#include<vector>
int main()
{
std::vector<int> arr;
arr.push_back(1);
arr.push_back(2);
for (auto n : arr)
{
std::cout << n << std::endl;
}
return 0;
}
上述方式是隻讀,如果需要修改arr裡邊的值,可以使用for(auto& n:arr),for迴圈的這種使用方式的內在實現實際上還是藉助迭代器的,所以如果在迴圈的過程中對arr進行了增加和刪除操作,那麼程式將對出現意想不到的錯誤。
遍歷map對映容器 三種方式
map<int, string> m;
// 1
for ( auto &v : m)
{
cout<<v.first<<" "<<v.second<<endl;
}
// 2 lamda表示式
for_each(m.begin(),m.end(),[](map<int,string>::reference a){
cout<<a.first<<" "<<a.second<<endl;
});
// 3 for_each
void fun(map<int,string>::reference a) //不要少了reference,不然會報錯。
{
cout<<a.first<<" "<<a.second<<endl;
}
for_each(m.begin(),m.end(),fun);
還有一種巨集定義的方法實現foreach迴圈:
//定義
#define foreach(container,it) \
for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)
//輸出
foreach(m,it)
{
cout<<it->first<<","<<it->second<<endl;
}