for_each()算法的使用

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

for_each()算法的使用的相关文章

C++ for_each() 算法

for_each()算法非常灵活,它允许你以不同的方式访问.处理.修改每一个元素,自C++11起,for循环提供了更方便更自然的行为,因此,for_each()恐将日渐丧失其重要性. algostuff.hpp #ifndef ALGOSTUFF_HPP #define ALGOSTUFF_HPP #include <array> #include <vector> #include <deque> #include <list> #include <

STL算法(14)——for_each()

for_each(b,e,p)// 对容器中的数据进行遍历  b和e是一对儿迭代器 p是一个函数或者是函数对象 使用for_each()算法遍历数据 使用for_each()和函数对象修改数据 使用for_each()返回值 #include<iostream> #include<algorithm> #include<vector> using namespace std; void print(int elem) { cout << elem <&

STL算法设计理念 - 函数对象和函数对象当參数和返回值

函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)"的方式使用一个类对象,假设没有上下文,全然能够把它看作一个函数对待. 这是通过重载类的operator()来实现的. "在标准库中.函数对象被广泛地使用以获得弹性".标准库中的非常多算法都能够使用函数对象或者函数来作为自定的回调行为: demo #include <iostr

c++泛型算法(1)

顺序容器只定义了很少的操作,为了能做其他更多有用的操作:查找特定元素,替换或删除某一特定值,重排元素顺序等.泛型算法是一些经典算法的公共接口 1.概述 大多数算法都定义在头文件algorithm中,标准库还在头文件numeric中定义了一组数值泛型算法. 泛型算法不会执行容器的操作,只会运行于迭代器之上,执行迭代器的操作 .这样就导致算法不能改变容器的大小,也就不能直接添加或删除元素了.因此标准库定义了一种叫插入器的特殊迭代器来完成向容器添加元素的效果. 2.初识泛型算法 标准库提供了超过100

C++中for_each的应用

C++中for_each的应用   for each语法是方便的,也是很自然的,这也是为什么很多语言都有这样的语法,就我所知,包括java(jdk5.0以上),python,php,asp.net等语言都有类似的语法,甚至微软为C++/CLI中也添加了这样的语法.但是很遗憾的是,C++98标准中没有,于是,我们只能通过可悲的for_each算法去模拟..........先看看原生的语法是多么方便和自然的吧,虽然有人将其视为语法糖,但是,就算是糖,这也是很甜的那种. 先看看Python中的循环,虽

STL学习笔记(非变动性算法)

辅助函数 本节跟以后几节将对所有STL算法逐一详细讨论.为了简化这些例子,我们使用了一些辅助函数,分别用于对容器进行输出跟插入操作. for_each()算法 for_each()算法非常灵活,它可以以不同的方式存取.处理.修改每一个元素 UnaryProc for_each(InputIterator beg,InputIterator end,UnaryProc op); 1.对与区间[beg,end)中的每一个元素调用:op(elem) 2.返回op(已在算法内部被变动过)的一个副本 3.

STL中的算法小结

(1)要运用STL的算法,首先必须包含头文件<algorithm>,某些STL算法用于数值处理,因此被定义于头文件<numeric> (2)所有STL算法都被设计用来处理一个或多个迭代器区间,第一个区间通常以起点和终点表示,至于其他区间,多数情况下你只需提供起点便足以,其终点可以自动以第一个区间的元素数量推断出来,调用者必须保证这些区间的有效性. STL算法采用覆盖模式而非安插模式,所以调用者必须保证目标区间拥有足够的元素空间,当然你也可以运用特殊的安插型迭代器将覆盖模式改变为安插

STL_算法_for_each

C++ Primer 学习中... 简单记录下我的学习过程 (代码为主) 所有容器适用 for_each(b,e,p) 1.使用for_each()算法遍历数据 2.使用for_each()和函数对象修改数据 3.使用for_each()的返回值 #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using name

C++11标准中常用到的各种算法汇总.

在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据的类型. 以下是我对常识的算法的总结,这些算法大部分都在algorithm.h中,还有一些在numeric.h中. 这里我们的容器都用这几个: vector<string> vec; vector<int> vec1; vec<string> vec2; 1.find();