专栏首页流媒体STL算法(for_each/transform)

STL算法(for_each/transform)

for_each

用于逐个遍历容器元素,它对迭代器区间[first,last)所指的每一个元素,执行由单参数函数对象f所定义的操作。方法返回函数对象。

函数的定义:

template<class _InIt,
    class _Fn1> inline
    _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    {   // perform function for each element
    _DEBUG_RANGE_PTR(_First, _Last, _Func);
    _For_each_unchecked(_Unchecked(_First), _Unchecked(_Last), _Func);
    return (_Func);
    }

示例:

#include "stdafx.h"
#include "algorithm"
#include "iostream";
using namespace std;
#include "vector";

//函数对象
struct PrintV {
private:
    int count;
public:
    void operator()( int & value) {
        count++;
        value++;
        cout << value << " ";
    }
    void print() {
        cout << "调用次数 " << count << endl;
    }
};
void print(vector<int> v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << "  ";
    }
}
int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(2);
    v.push_back(5);
    v.push_back(4);
    print(v);
    cout << endl;
    PrintV pv=for_each(v.begin(), v.end(), PrintV());
    cout << endl;
    pv.print();
    print(v);
    return 0;
}

for_each

transform

函数定义

template<class _InIt,
    class _OutIt,
    class _Fn1> inline
    _OutIt transform(_InIt _First, _InIt _Last,
        _OutIt _Dest, _Fn1 _Func)
    {   // transform [_First, _Last) with _Func
    _DEPRECATE_UNCHECKED(transform, _Dest);
    return (_Transform_no_deprecate(_First, _Last, _Dest, _Func));
    }

 #if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt,
    class _OutTy,
    size_t _OutSize,
    class _Fn1> inline
    _OutTy *transform(_InIt _First, _InIt _Last,
        _OutTy (&_Dest)[_OutSize], _Fn1 _Func)
    {   // transform [_First, _Last) with _Func, array dest
    return (_Unchecked(
        _Transform_no_deprecate(_First, _Last,
            _Array_iterator<_OutTy, _OutSize>(_Dest), _Func)));
    }
 #endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */

有两个重载函数,一个可以传入一元谓词,一个可以传入二元谓词。

与for_each区别
  • for_each的仿函数可以返回void。transform的仿函数必须返回值。
  • for_each的仿函数的参数是传入的引用。transform的仿函数的参数最好是值传递 示例
struct TranFunc2 {
private:
    int count;
public:
    int operator()(const int & left,const int & right) {
        count++;
        cout << "left right " << left << "  " << right << endl;
        return left+right;
    }
    void print() {
        cout << "调用次数 " << count << endl;
    }
};
void print(vector<int> v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << "  ";
    }
    cout << endl;
}
int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(2);
    v.push_back(5);
    v.push_back(4);
    vector<int> v1=v;
    v1.push_back(100);
    cout << "遍历v" << endl;
    print(v);
    cout << "遍历v1" << endl;
    print(v1);
    vector<int>::iterator it=transform(v.begin(), v.end(), v1.begin(), TranFunc());
    //v1的元素比v多一个所以,当执行transform后,v
    //的迭代器到了末尾,而v1并没有
    cout << "it==v1.end():" << (it==v1.end()) << endl;
    print(v1);
    //遍历v从begin到end。同时从v1的begin开始。最后
    //结果存入到v中,从v的begin开始,结果返回v的迭代器
    it=transform(v.begin(), v.end(), v1.begin(), v.begin(), TranFunc2());
    //返回v的迭代器,v的迭代器已到末尾。
    cout << "it==v1.end():" << (it == v.end()) << endl;
    print(v);
    return 0;
}

结果

transform.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ string

    用户2929716
  • Builder模式剖析示例

    当一个对象创建的过程比较简单,比如:手机,在发布时候型号功能颜色都已经确定,这是我们只需要一个手机工厂给我们创建即可。当一个对象产品比较复杂,自定义属性的比较多...

    用户2929716
  • 命令模式

    这里我们用一个场景来描述:去川湘阁饭店点一份剁椒鱼头和宫保鸡丁。 这里我们把整个关键流程写出来

    用户2929716
  • 我所理解的Remoting(1):Marshaling & Activation[下篇]

    在上面一片文章,我花了大量的文字来来描述了Remote Object如何通过Marshaling的过程从Server端所在的Application Domain...

    蒋金楠
  • LeetCode:110_Balanced Binary Tree | 平衡二叉树 | Easy

    要求:判断一棵树是否是平衡二叉树 Given a binary tree, determine if it is height-balanced. For ...

    CloudDeveloper
  • IDEA的java源码文件左边有一个红色的J

    如果源码文件这里已经有一个路径,那就添加现在的.java文件所在目录,或者删除了再重新添加

    爱学习的孙小白
  • 行业人士需要知道关于容器即服务的一切

    容器即服务提供了一种设置容器集群的简单方法。而选择正确的通讯即服务(CaaS)平台则取决于托管和容器堆栈的灵活性。 由于出现了大量的容器即服务或者CaaS,产品...

    静一
  • 【LeetCode】面试题57 - II. 和为s的连续正数序列

    输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

    韩旭051
  • 剑指offer——序列化二叉树

    AI那点小事
  • Invalid byte tag in constant pool: 19

    凯哥Java

扫码关注云+社区

领取腾讯云代金券