首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STL算法(for_each/transform)

STL算法(for_each/transform)

作者头像
用户2929716
发布2018-08-23 13:19:11
2940
发布2018-08-23 13:19:11
举报
文章被收录于专栏:流媒体流媒体流媒体

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • for_each
  • transform
    • 与for_each区别
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档