• cb38a_c++_STL_算法_transform


    cb38a_c++_STL_算法_transform
    transform()算法有两种形式:
    transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间)
    transform(b1,e1,b2,b3,op)//把b1,b2结合一起通过op函数处理,存放到b3

    注意:
    1.如果目标与源相同,transform()就和for_each()一样
    2.如果想以某值替换符合规则的元素,应该使用replace()算法。


    transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。transform函数包含在<algorithm>头文件中。

    以下是std::transform的两个声明,

    一元操作:

    template <class InputIterator, class OutputIterator, class UnaryOperation>

    OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);
    对于一元操作,将op应用于[first1, last1]范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1+1次。

    op可以是函数指针或函数对象或lambda表达式。

    例如:op的一个实现 即将[first1, last1]范围内的每个元素加5,然后依次存储到result中。

    int op_increase(int i) {return (i + 5)};
    调用std::transform的方式如下:

    std::transform(first1, last1, result, op_increase);
    二元操作:

    template <class InputIterator1, class InputIterator2,class OutputIterator, class BinaryOperation>
    OutputIterator transform (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);

    对于二元操作,使用[first1, last1]范围内的每个元素作为第一个参数调用binary_op,并以first2开头的范围内的每个元素作为第二个参数调用binary_op,
    每次调用返回的值都存储在以result开头的范围内。给定的binary_op将被连续调用last1-first1+1次。binary_op可以是函数指针或函数对象或lambda表达式。

    例如:binary_op的一个实现即将first1和first2开头的范围内的每个元素相加,然后依次存储到result中。

    int op_add(int, a, int b) {return (a + b)};
    调用std::transform的方式如下:

    std::transform(first1, last1, first2, result, op_add);

    #include <functional> //预定义函数对象
    negate<int>() 把一个数变成负数


    1>d:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.16.27023includealgorithm(1443):
    template<class _InIt,
    class _OutIt,
    class _Fn> inline
    _OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
    { // transform [_First, _Last) with _Func
    _Adl_verify_range(_First, _Last);
    auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast = _Get_unwrapped(_Last);
    auto _UDest = _Get_unwrapped_n(_Dest, _Idl_distance<_InIt>(_UFirst, _ULast));
    for (; _UFirst != _ULast; ++_UFirst, (void)++_UDest)
    {
    *_UDest = _Func(*_UFirst);
    }

    _Seek_wrapped(_Dest, _UDest);
    return (_Dest);
    }

    使用预定义函数对象有2个参数是,需要使用预定义函数对象适配器,bind2nd
    bind2nd(multiplies<int>(),10)
    //error C2065: “ostream_iterator”: 未声明的标识符,未包含#include<iterator>

      1 /*cb38a_c++_STL_算法_transform
      2 transform()算法有两种形式:
      3 transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间)
      4 transform(b1,e1,b2,b3,op)//把b1,b2结合一起通过op函数处理,存放到b3
      5 
      6 注意:
      7 1.如果目标与源相同,transform()就和for_each()一样
      8 2.如果想以某值替换符合规则的元素,应该使用replace()算法。
      9 
     10 
     11 transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。transform函数包含在<algorithm>头文件中。
     12 
     13 以下是std::transform的两个声明,
     14 
     15 一元操作:
     16 
     17 template <class InputIterator, class OutputIterator, class UnaryOperation>
     18 
     19 OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);
     20 对于一元操作,将op应用于[first1, last1]范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1+1次。
     21 
     22 op可以是函数指针或函数对象或lambda表达式。
     23 
     24 例如:op的一个实现 即将[first1, last1]范围内的每个元素加5,然后依次存储到result中。
     25 
     26 int op_increase(int i) {return (i + 5)};
     27 调用std::transform的方式如下:
     28 
     29 std::transform(first1, last1, result, op_increase);
     30 二元操作:
     31 
     32 template <class InputIterator1, class InputIterator2,class OutputIterator, class BinaryOperation>
     33 OutputIterator transform (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);
     34 
     35 对于二元操作,使用[first1, last1]范围内的每个元素作为第一个参数调用binary_op,并以first2开头的范围内的每个元素作为第二个参数调用binary_op,
     36 每次调用返回的值都存储在以result开头的范围内。给定的binary_op将被连续调用last1-first1+1次。binary_op可以是函数指针或函数对象或lambda表达式。
     37 
     38 例如:binary_op的一个实现即将first1和first2开头的范围内的每个元素相加,然后依次存储到result中。
     39 
     40 int op_add(int, a, int b) {return (a + b)};
     41 调用std::transform的方式如下:
     42 
     43 std::transform(first1, last1, first2, result, op_add);
     44 
     45 #include <functional> //预定义函数对象
     46 negate<int>() 把一个数变成负数
     47 
     48 
     49 1>d:program files (x86)microsoft visual studio2017communityvc	oolsmsvc14.16.27023includealgorithm(1443):
     50 template<class _InIt,
     51     class _OutIt,
     52     class _Fn> inline
     53     _OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
     54     {    // transform [_First, _Last) with _Func
     55     _Adl_verify_range(_First, _Last);
     56     auto _UFirst = _Get_unwrapped(_First);
     57     const auto _ULast = _Get_unwrapped(_Last);
     58     auto _UDest = _Get_unwrapped_n(_Dest, _Idl_distance<_InIt>(_UFirst, _ULast));
     59     for (; _UFirst != _ULast; ++_UFirst, (void)++_UDest)
     60         {
     61         *_UDest = _Func(*_UFirst);
     62         }
     63 
     64     _Seek_wrapped(_Dest, _UDest);
     65     return (_Dest);
     66     }
     67 
     68     使用预定义函数对象有2个参数是,需要使用预定义函数对象适配器,bind2nd
     69      bind2nd(multiplies<int>(),10)
     70  //error C2065: “ostream_iterator”: 未声明的标识符,未包含#include<iterator>
     71 
     72 */
     73 
     74 #include <iostream>
     75 #include <algorithm>
     76 #include <vector>
     77 #include <list>
     78 #include <functional> //预定义函数对象
     79 #include <iterator>
     80 
     81 using namespace std;
     82 
     83 int main()
     84 {
     85     vector<int> ivec;
     86     list<int> ilist;
     87     for (int i = 1; i <= 9; ++i)
     88         ivec.push_back(i);
     89     for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
     90         cout << *iter << ' ';
     91     cout << endl;
     92 
     93     //transfrom自己把自己的数修改为负数
     94 
     95     transform(ivec.begin(), ivec.end(), ivec.begin(), negate<int>());//negate<int>() 把一个数变成负数
     96     for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
     97         cout << *iter << ' ';
     98     cout << endl;
     99 
    100     transform(ivec.begin(), ivec.end(), back_inserter(ilist), bind2nd(multiplies<int>(),10));////预定义函数对象,每个数乘以10
    101 
    102     cout << "预定义函数对象,每个数乘以10" << endl;
    103     for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter)
    104         cout << *iter << ' ';
    105     cout << endl;
    106 
    107     cout << "先把list取负,再把数据指定到cout输出流里面" << endl;
    108 
    109     transform(ilist.begin(), ilist.end(), ostream_iterator<int>(cout, " "), negate<int>());
    110     return 0; 
    111 }
     1 /*cb38b_c++_STL_算法_transform
     2 transform()算法有两种形式:
     3 transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间)
     4 transform(b1,e1,b2,b3,op)//把b1,b2结合一起通过op函数处理,存放到b3
     5 
     6 //自己和自己相加,放入ilist容器里面。
     7     transform(ivec.begin(), ivec.end(), ivec.begin(), back_inserter(ilist), plus<int>());
     8     //
     9 
    10     error C2955: “std::ostream_iterator”: 使用 类 模板 需要 模板 参数列表
    11 
    12     ostream_iterator(cout, " "),
    13     ostream_iterator<int>(cout, " "),忘记写<int>
    14 */
    15 
    16 #include <iostream>
    17 #include <vector>
    18 #include <list>
    19 #include <algorithm>
    20 #include <iterator>
    21 
    22 using namespace std;
    23 
    24 int main()
    25 {
    26     vector<int> ivec;
    27     list<int> ilist;
    28     for (int i = 1; i <= 9; ++i)
    29         ivec.push_back(i);
    30     for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
    31         cout << *iter << ' ';
    32     cout << endl;
    33 
    34     cout << "容器自己内部数据操作,操作后还是放回自己的容器,自己和自己相乘" << endl;
    35     transform(ivec.begin(), ivec.end(), ivec.begin(), ivec.begin(), multiplies<int>());
    36     for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
    37         cout << *iter << ' ';
    38     cout << endl;
    39 
    40     //自己和自己相加,放入ilist容器里面。
    41     transform(ivec.begin(), ivec.end(), ivec.begin(), back_inserter(ilist), plus<int>());
    42     //
    43     cout << "//自己和自己相加,放入ilist容器里面。" << endl;
    44     for (list<int>::iterator iter = ilist.begin();  iter!= ilist.end(); ++iter)
    45         cout << *iter << ' ';
    46     cout << endl;
    47 
    48     cout << "通过transform向量与list相减,放入ilist容器里面,用cout输出" << endl;
    49     transform(ivec.begin(), ivec.end(), ilist.begin(), ostream_iterator<int>(cout, " "), minus<int>());
    50 
    51     
    52     return 0;
    53 
    54 }
    欢迎讨论,相互学习。 txwtech@163.com
  • 相关阅读:
    MSSQL错误1069解决方法
    Xamarin的Mono for Android目前可运行于MIPS上
    Oracle大数据机和连接器产品支持与Hadoop和Cloudera Manager集成
    百度1
    恒生电子
    IGT中国
    经典笔试题——a和&a有什么区别
    腾讯HTTP协议1
    腾讯http协议2
    面向对象的三大特征
  • 原文地址:https://www.cnblogs.com/txwtech/p/12350238.html
Copyright © 2020-2023  润新知