【C++STL】遍历算法(for_each)的原理与使用

一、STL算法概述

  1. 算法主要包含在头文件<algorithm> <functional> <numeric>
  2. <algorithm>是所有STL头文件中最大的,涉及到:遍历、比较、 查找、交换、复制、修改等操作
  3. <functional>定义了一些模板类,用来声明函数对象
  4. <numeric>最小,只包含几个在序列上进行简单数学运算的模板函数

算法分为:质变算法非质变算法

  • 质变算法:运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等
  • 非质变算法:运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等

二、for_each

功能: 遍历容器中所有元素

  • for_each()算法非常灵活,允许以不同的方式访问、处理、修改每一个元素。因此,for_each()既属于质变算法,也属于非质变算法。
函数原型: for_each(iterator beg, iterator end, func) 解释
参数1 iterator beg 开始迭代器
参数2 iterator end 结束迭代器
参数3 func 函数或者函数对象

实现:

//for_each()的实现如下
template <typename Iterator, typename Operation>
    Operation for_each (Iterator beg, Iterator end, Operation op)
    {
    
    
        while(beg != end)
        {
    
    
            op(*beg);
            ++beg;
        }
        return op;
    }

示例:

#include <iostream>
#include <algorithm> //必须包含该头文件
#include <vector>
using namespace std;

//普通函数
void printA(int value)
{
    
    
	cout << value << " ";
}

//函数对象(仿函数)
class printB
{
    
    
public:
	void operator()(int value)
	{
    
    
		cout << value << " ";
	}
};

class printC
{
    
    
public:
	void operator()(int& value)
	{
    
    
		value = value + 1;    //修改入参的值
		cout << value << " ";
	}
};

void test01() 
{
    
    
	vector<int> vec;
	for (int i = 0; i < 10; i++)
	{
    
    
		vec.push_back(i);
	}

	//普通函数遍历算法
	cout << "for_each printA:";
	for_each(vec.begin(), vec.end(), printA);
	cout << endl;

	//函数对象(仿函数)遍历算法-非质变算法
	cout << "for_each printB():";
	for_each(vec.begin(), vec.end(), printB());
	cout << endl;

	//函数对象(仿函数)遍历算法-质变算法
	cout << "for_each printC():";
	for_each(vec.begin(), vec.end(), printC());
	cout << endl;
}

int main()
{
    
    
	test01();
	system("pause");
	return 0;
}
//result
for_each printA:0 1 2 3 4 5 6 7 8 9
for_each printB():0 1 2 3 4 5 6 7 8 9
for_each printC():1 2 3 4 5 6 7 8 9 10

注:自C++11起,range-based for循环提供了更方便、更自然的遍历方法。因此,for_each()算法其重要性可能会逐渐降低。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AAADiao/article/details/130992259
今日推荐