STL算法之遍历

遍历算法

  • for_each  可有有返回值
  • 可以绑定参数进行输出
  • transform  将容器中的数据进行搬运到另一个容器中
  • 注意:transform  目标容器需要开辟空间

for_each(iterator beg, iterator end, _callback);

  • 遍历算法 遍历容器元素
  • @param beg 开始迭代器
  • @param end 结束迭代器
  • @param _callback  函数回调或者函数对象
  • @return 函数对象

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <functional>
#include <algorithm>
//1.for_each普通遍历
struct myPrint01
{
    void operator()(int v)
    {
        cout << v << endl;
    }
};
void test01()
{
    vector<int>v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    for_each(v.begin(), v.end(), myPrint01());
}
//2.for_each可以保存内部记录
struct myPrint02
{
    void operator()(int v)
    {
        cout << v << endl;
        m_Count++;
    }
    int m_Count;
};
void test02()
{
    vector<int>v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    //for_each做遍历的时候会返回函数对象
    myPrint02 print2 =  for_each(v.begin(), v.end(), myPrint02());
    cout << print2.m_Count << endl;
}
//3.for_each可以绑定参数进行输出
struct myPrint03:public binary_function<int,int,void>
{
    void operator()(int v, int start)const
    {
        cout << v + start << endl;
    }
};
void test03()
{
    vector<int>v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    
    for_each(v.begin(), v.end(), bind2nd(myPrint03(), 1000));
    
}

 

transform(iterator beg1, iterator end1, iterator beg2, _callbakc)

  • transform算法 将指定容器区间元素搬运到另一容器中
  • 注意 : transform 不会给目标容器分配内存,所以需要我们提前分配好内存
  • @param beg1 源容器开始迭代器
  • @param end1 源容器结束迭代器
  • @param beg2 目标容器开始迭代器
  • @param _cakkback 回调函数或者函数对象
  • @return 返回目标容器迭代器
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <functional>

//1.搬运 把一个容器内的数据搬运到另一个容器中
struct Transform
{
    int operator()(int v)
    {
        return v + 10;          //搬运过程中给源容器每个数据+10
    }
};
void test01()
{
    vector<int>v;   //源容器
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    vector<int> vTarget;//目标容器
    vTarget.resize(v.size());       //重要 一定要给目标容器分配内存

    transform(v.begin(), v.end(), vTarget.begin(), Transform());        //搬运的同时修改每个成员的值

    for_each(vTarget.begin(), vTarget.end(), [](int v) { cout << v << endl; });
}
//2.把两个容器内的数据 一起搬运到第三个容器内 可以加逻辑运算
struct Transform02
{
    int operator()(int v1, int v2)
    {
        return v1 + v2;
    }
};
void test02()
{
    vector<int>v1;   //源容器
    vector<int>v2;   //源容器
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i + 100);
        v2.push_back(i + 200);
    }

    vector<int> vTar;   //目标容器
    vTar.resize(v1.size());
    transform(v1.begin(), v1.end(), v2.begin(), vTar.begin(), Transform02());

    for_each(vTar.begin(), vTar.end(), [](int v) {cout << v << endl; });
}
int main()
{
    test02();
    //test01();
    system("Pause");
    return 0;
}

结果:

STL算法之遍历

 

STL算法之遍历

上一篇:Java将excel解析成List


下一篇:自定义配置Springboot内嵌的tomcat