您的位置:首页 > 编程语言 > C语言/C++

C++ for_each学习笔记

2015-11-23 21:42 471 查看
欢迎转载,转账请注明原文地址/article/8326783.html

一、学习完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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: