C++ 算法 中的 transform函数

首页 / C++入门教程 / C++ 算法 中的 transform函数

C++算法 transform()函数以两种不同的方式使用:

1.一元运算  :-  此方法对range[first1,last1]中的元素执行一元运算op,并将结果存储在从result开始的参数中。

此transform()将函数应用于参数的每个元素:

C++ Algorithm transform Function

2.二进制操作:-  此方法对range[first1,last1]内元素执行以二进制数操作,该参数内的元素以迭代器first2开头,并将结果存储在从result开始的参数内。

C++ Algorithm transform Function

transform - 语法

一元操作(1)

template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);

二进制运算(2)

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

transform - 参数

first1 :一个输入迭代器,它指向要操作的第一个参数的第一个元素的位置。

last1 :一个迭代器,将位置指向要操作的第一个参数的最后一个元素。

first2 :输入迭代器,该迭代器指向要操作的第二个参数中的第一个元素。

result:一个输出迭代器,该迭代器存储操作结果的参数的初始位置。

op :一元函数应用于参数的每个元素。

binary_op :两个元素作为参数传递的二进制函数。

transform - 返回值

transform()返回一个指向转换参数末端的迭代器。

transform - 例子1

让我们看一个简单的例子来演示transform()的用法:

#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <iterator>

using namespace std;

int main() {
  vector<int> v = { 3,1,4 };
  vector<string> result;

  transform(v.begin(), v.end(), back_inserter(result),
    [](int x) { return to_string(x * 2); });

  for_each(result.begin(), result.end(),
    [](const string& s) { cout << s << endl; });
}

输出:

6
2
8

transform - 例子2

让我们看另一个简单的例子:

#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <iterator>

using namespace std;

int main() {
  vector<char> v1 = { 'a','b','c' };
  vector<int> v2 = { 3,1,4 };
  vector<string> result;

  transform(v1.begin(), v1.end(), v2.begin(), back_inserter(result),
    [](char a, int b) { return string(b, a); });

  for_each(result.begin(), result.end(),
    [](const string& s) { cout << s << endl; });

return 0;
}

输出:

aaa
b
cccc

transform - 例子3

让我们看另一个简单的例子:

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <iterator>
#include <iomanip>
#include <cmath>

using namespace std;
 
typedef const vector <int>& vecref;
 
int power(int a, int b)
{
    return pow(a, b);
}
 
void print(vecref a, vecref b, vecref c)
{
    cout << "b[i]   a[i]    c[i]" << endl; 
    for(int i = 0; i < a.size(); i++)
    {
        cout << setw(2) << setfill(' ') << a[i] << "   ^   "
             << setw(1) << setfill(' ') << b[i] << "   =  "
             << setw(2) << setfill(' ') << c[i] << endl;
    }
}
 
int main()
{
    vector <int> a(10), b(10), c(10);
 
    for (int i = 0; i < 10 ;i++)
    {
        a[i] = (i % 2 + 1);
        b[i] = (i % 3 + 1);
    }
   //Save the result in vector c
    cout << "Transform operation" << endl;
    transform(b.begin(), b.end(), a.begin(), c.begin(), power);
    print(b, a, c);
    
    return 0;
}

输出:

Transform operation
b[i]   a[i]    c[i]
 1   ^   1   =   1
 2   ^   2   =   4
 3   ^   1   =   3
 1   ^   2   =   1
 2   ^   1   =   2
 3   ^   2   =   9
 1   ^   1   =   1
 2   ^   2   =   4
 3   ^   1   =   3
 1   ^   2   =   1

上面的示例说明了transform()算法。该程序创建两个向量,并通过从第一个向量引发到第二个向量中元素的幂的插入一个等于元素的值来变换第三个向量。函数功效作为断言传递给函数transform()。

transform - 例子4

让我们看另一个简单的例子:

#include <iostream>    //cout
#include <algorithm>   //transform
#include <vector>      //vector
#include <functional>  //plus

using namespace std;

int op_increase (int i) { return ++i; }

int main () {
  vector<int> foo;
  vector<int> bar;

 //set some values:
  for (int i=1; i<6; i++)
    foo.push_back (i*10);                        //foo: 10 20 30 40 50

  bar.resize(foo.size());                        //allocate space

  transform (foo.begin(), foo.end(), bar.begin(), op_increase);
                                                 //bar: 11 21 31 41 51

 //plus adds together its two arguments:
  transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), plus<int>());
                                                 //foo: 21 41 61 81 101

  cout << "foo contains:";
  for (vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
    cout << ' ' << *it;
  cout << '\n';

  return 0;
}

输出:

foo contains: 21 41 61 81 101

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Java并发编程实战 -〔王宝令〕

黄勇的OKR实战笔记 -〔黄勇〕

现代C++编程实战 -〔吴咏炜〕

Selenium自动化测试实战 -〔郭宏志〕

实用密码学 -〔范学雷〕

基于人因的用户体验设计课 -〔刘石〕

说透元宇宙 -〔方军〕

手把手带你写一个MiniSpring -〔郭屹〕

云时代的JVM原理与实战 -〔康杨〕

好记忆不如烂笔头。留下您的足迹吧 :)