C++ STL算法:使用for_each()处理指定范围内的元素

本文详细介绍了C++STL中的for_each算法及其用法,包括如何使用一元函数对象和lambda表达式处理指定范围内的元素,并展示了如何利用返回的函数对象存储状态信息。实例中通过vector和string展示了算法的应用。
摘要由CSDN通过智能技术生成

C++ STL算法:使用for_each()处理指定范围内的元素

算法 for_each( )对指定范围内的每个元素执行指定的一元函数对象,其用法如下:
fnObjType retValue = for_each (start_of_range,
end_of_range,
unaryFunctionObject);
也可使用接受一个参数的 lambda 表达式代替一元函数对象。
返回值表明, for_each( )返回用于对指定范围内的每个元素进行处理的函数对象( functor)。这意
味着使用结构或类作为函数对象可存储状态信息,并在 for_each( )执行完毕后查询这些信息,如程序清
单 23.6 所示。该程序清单使用函数对象显示指定范围内的元素,并使用它了确定显示了多少个元素。

0: #include <algorithm>
1: #include <iostream>
2: #include <vector>
3: #include <string>
4: using namespace std;
5:
6: template <typename elementType>
7: struct DisplayElementKeepcount
8: {
9: int count;
10: DisplayElementKeepcount (): count (0) {}
11:
12: void operator () (const elementType& element)
13: {
14: ++ count;
15: cout << element << ' ';
16: }
17: };
18:
19: int main ()
20: {
21: vector <int> numsInVec{ 2017, 0, -1, 42, 10101, 25 };
22:
23: cout << "Elements in vector are: " << endl;
24: DisplayElementKeepcount<int> functor =
25: for_each (numsInVec.cbegin(), // Start of range
26: numsInVec.cend (), // End of range
27: DisplayElementKeepcount<int> ());// functor
28: cout << endl;
29:
30: // Use the state stored in the return value of for_each!
31: cout << "'" << functor.count << "' elements displayed" << endl;
32:
33: string str ("for_each and strings!");
34: cout << "Sample string: " << str << endl;
35:
36: cout << "Characters displayed using lambda:" << endl;
37: int numChars = 0;
38: for_each (str.cbegin(),
39: str.cend (),
40: [&numChars](char c) { cout << c << ' '; ++numChars; } );
41:
42: cout << endl;
43: cout << "'" << numChars << "' characters displayed" << endl;
44:
45: return 0;
46: }

输出:
Elements in vector are:
2017 0 -1 42 10101 25
‘6’ elements displayed
Sample string: for_each and strings!
Characters displayed using lambda:
f o r _ e a c h a n d s t r i n g s !
‘21’ characters displayed
分析:
上述代码不仅演示了如何使用 for_each( ),还指出通过它返回的函数对象( functor)的成员 count,
可获得它被调用了多少次,如第 25 和 38 行所示。上述代码定义了两个范围,一个包含在整型 vector
numsInVec 中,另一个是 std::string 对象 str。第一次调用 for_each( )时,将 DisplayElementKeepCount
用作一元谓词,而第二次调用时使用的是一个 lambda 表达式。 for_each( )对指定范围内的每个元素调
用 operator(),而 operator()将元素显示在屏幕上,并将内部计数器加 1。 for_each( )执行完毕后返回该函
数对象,其成员 count 指出了函数对象被调用的次数。在实际编程中,将信息(或状态)存储在算法返
回的对象中很有帮助。第 38 行的 for_each( )执行的操作与第 25 行的 for_each( )相同,但操作的是一个
std::string,且使用的是 lambda 表达式,而不是函数对象。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值