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
请按任意键继续. . .
*/
时间: 2024-10-13 00:38:01