C++学习笔记(23):常用算法(for_each,transform)

22 阅读1分钟

1.概述

  • 算法主要由头文件组成
  • 是所有STL头文件中最大的一个,范围涉及到比较,交换,查找,遍历操作,复制,修改等等
  • 体积很小,只包括几个在序列上面进行简单数学运算的模板函数
  • 定义了一些模板类,用以声明函数对象

2.常用遍历算法

  • for_each //遍历容器
  • transform //搬运容器到另一个容器中

3.

一、std::for_each

作用:遍历容器,对每个元素「做某事」,一般不修改原值(也可以改)

头文件:

cpp

#include <algorithm>
#include <vector>
#include <iostream>

 

极简例子:打印每个数字

cpp

#include <algorithm>
#include <vector>
 #include <iostream>
using namespace std;

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

// 对每个元素,执行后面的 lambda
for_each(v.begin(), v.end(), [](int x) {
    cout << x << " ";  // 只是打印,不修改
});

return 0;
 }

 

你可以理解成:

「对每一个元素,都干这件事」

  输出:

plaintext

1 2 3 4  

二、std::transform(iterator beg1,iterator end1,iterator beg2, _func) //beg1 源容器开始迭代器 //end1 源容器结束迭代器 //beg2 目标容器开始迭代器 //_func 函数或者函数对象

作用:把每个元素「加工一下」,生成新容器 / 覆盖原容器

例子:每个数字 ×2,放到新容器

cpp

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

    int main() {
    vector<int> v1 = {1, 2, 3, 4};
    vector<int> v2(v1.size());  // 用来存结果

    // 把 v1 每个元素处理后,放进 v2
    transform(v1.begin(), v1.end(),
          v2.begin(),
          [](int x) {
              return x * 2;   // 加工规则
          });

    for (int x : v2) cout << x << " ";
    return 0;
    }

 

输出:

plaintext

2 4 6 8  

你可以理解成:

「把每个元素变形,得到新的一批元素」

 

一句话分清

  • for_each:遍历 + 做事(打印、统计、修改等),不返回新容器
  • transform:遍历 + 转换,一定会产生新结果