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 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition问题描述:原因分析:解决方案:

在Java代码中,我们是不推荐带有变长参数的方法重载的。这样的代码调用人类阅读起来会感到“模糊”。

1955
来自专栏Hongten

Java Web javaBean

<jsp:useBean class="webbook.chapter9.Book" id="book" scope="page"/>

802
来自专栏Web行业观察

MySQL向MongoDB的妥协之JSON

MySQL在5.7.8版本中增加了对json数据的支持,而不再是需要使用字符串形式进行存储。下面简单介绍下MySQL对json的操作:

5793
来自专栏Java帮帮-微信公众号-技术文章全总结

09(02)总结final,多态,抽象类,接口

(4)抽象类的练习 A:猫狗案例练习 B:老师案例练习 C:学生案例练习 D:员工案例练习 /* A: 猫狗案例 具体事物:猫,狗 共性:姓名,...

4146
来自专栏算法修养

POJ--3321 Apple Tree(树状数组+dfs(序列))

Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2...

4047
来自专栏我的博客

基数排序

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,...

2956
来自专栏算法channel

程序员必看:实现栈有这两种策略,有完整分析和代码实现

这两篇中分别总结了程序的时间性能度量指标,典型的时间复杂度类型,Java中类型的空间消耗的量化情况。后一篇考虑计算机中最重要的基础算法查找和排序算法,这篇可以说...

1040
来自专栏python读书笔记

python 数据分析基础 day9-datetime类型常用对象以及函数日期类型的运算

今天是读《python数据分析基础》的第9天,今天将通过python的date模块来总结日期类型。 常用对象以及函数 对象 可通过date模块创建创建以下对象:...

3066
来自专栏简书专栏

Python面对对象编程

面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复填写,仅调用函数即可 面对对象:对函数进行分类和封装,让开发"更好更快...

1503
来自专栏LinkedBear的个人空间

唠唠SE的集合-07——HashSet 原

哈希表是一个数组,当一个数据(对象)要添加时,先计算对象的hashCode,来确定它应该对应数组的哪个位置,如果那个位置没有数据,则该元素放到对应位置上;如果有...

683

扫码关注云+社区

领取腾讯云代金券