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 
#include 
#include 

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 
#include 
#include 

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 
#include 
#include 

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
请按任意键继续. . .
*/

你可能感兴趣的:(《C++标准库》)