您的位置:首页 > 其它

for_each()算法的使用

2016-05-08 21:18 363 查看
for_each()算法非常灵活,允许不同方式访问、处理、修改每一个元素。

UnaryProc

for_each(InputIterator beg, InputIterator end, UnaryProc op)


1、 对区间[beg, end)中每一个元素调用:

op(elem)


2、 返回op的一个拷贝(副本),自C++11起,返回的op已被改动过

3、 op可以改动元素。

4、 op的任何返回值都会被忽略。

5、 复杂度:线性。调用op()共numElems次。

不修改元素程序实例

把每一个元素传给一个lambda,后者将它所获得的元素打印出来:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
inline void insert_elems(T& coll, int first, int last)
{
for (int i = first; i <= last; i++)
{
coll.insert(coll.end(), i);
}
}

int main()
{
vector<int> coll;
insert_elems(coll, 1, 9);

for_each(coll.begin(), coll.end(),
[](int elem)
{
cout << elem << ' ';
});

cout << endl;
system("pause");
}


运行结果:

/*
1 2 3 4 5 6 7 8 9
请按任意键继续. . .
*/


下例示范如何改变元素

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
inline void insert_elems(T& coll, int first, int last)
{
for (int i = first; i <= last; i++)
{
coll.insert(coll.end(), i);
}
}

template <typename T>
inline void print(T coll)
{
for (auto elem : coll)
{
cout << elem << ' ';
}
cout << endl;
}
int main()
{
vector<int> coll;
insert_elems(coll, 1, 9);

//每个元素+10
for_each(coll.begin(), coll.end(),
[](int& elem)
{
elem += 10;
});
print(coll);

//把第一个元素的值加至每一个元素
for_each(coll.begin(), coll.end(),
[=](int& elem)  //=operator
{
elem += *coll.begin();
});
print(coll);

system("pause");
}


/*
11 12 13 14 15 16 17 18 19
22 23 24 25 26 27 28 29 30
请按任意键继续. . .
*/


程序分析:

改动元素必须声明elem的类型为引用(reference),也必须定义lambda的capture像这样[=],为的是加“第一元素的拷贝”。

如果第二个for_each()传入引用,即把[=]换成[&],

for_each(coll.begin(), coll.end(),
[&](int& elem)  //=operator
{
elem += *coll.begin();
});


“加数”会改变,导致以下输出:

11 12 13 14 15 16 17 18 19
22 34 35 36 37 38 39 40 41
请按任意键继续. . .


利用for_each()的返回值

第三个例子展示如何利用for_each()的返回值。

for_each()有一个特殊性质就是它能返回其操作,我们可以利用这一特性,处理和返回“置于该操作中的结果”:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
inline void insert_elems(T& coll, int first, int last)
{
for (int i = first; i <= last; i++){
coll.insert(coll.end(), i);
}
}

class MeanValue
{
private:
long num_;
long sum_;
public:
MeanValue()
: num_(0)
, sum_(0)
{}

void operator()(int elem){
++num_;
sum_ += elem;
}

operator double(){
return static_cast<double>(sum_) / static_cast<double>(num_);
}
};

int main()
{
vector<int> coll;
insert_elems(coll, 1, 8);

double mv = for_each(coll.begin(), coll.end(),MeanValue());
cout << "mean value: " << mv << endl;

system("pause");
}


/*
mean value: 4.5
请按任意键继续. . .
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: