C++基础知识(二十一) --- 遍历算法for_each&transform

本文详细介绍了C++ STL中的两种算法:for_each和transform。for_each用于遍历容器并执行指定操作,可以是普通函数或函数对象,还可以绑定参数。transform则可以将一个容器的元素转换或操作后存入另一个容器,支持单个或两个输入容器的元素进行运算。文章通过实例展示了这两种算法的基本用法和返回值处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

算法概述

遍历算法:

(1)for_each:

for_each 基本用法:

带返回值的 for_each:

for_each 绑定参数输出:

(2)transform:

 transform 将一个容器的值搬运到另一个容器中

 transform 将容器1和容器2中的元素相加后放到目标容器中


算法概述

算法主要由头文件 <algorithm> <functional> <numeric>组成。

<algorithm> :是所有STL头文件中最大的一个,其中常用的功能有比较、交换、查找、遍历、复制、修改、反转、排序、合并等。

<functional> :定义了一些模板类,用以声明函数对象。

<numeric> :体积很小,只包括在几个序列容器上进行的简单运算的模板函数。

遍历算法:

(1)for_each:

/*
    遍历算法 遍历容器元素
	@param beg 开始迭代器
	@param end 结束迭代器
	@param _callback  函数回调或者函数对象
	@return 函数对象
*/
for_each(iterator beg, iterator end, _callback);

for_each 基本用法:

//普通函数
void print01(int val)
{
	cout << val <<" ";
}
//函数对象
struct print02
{
	void operator()(int val)
    {
		cout << val <<" ";
	}
};

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

	//遍历算法
	for_each(v.begin(), v.end(), print01);
	cout << endl;

	for_each(v.begin(), v.end(), print02());
	cout << endl;
}

带返回值的 for_each:

struct print03
{
	print03()
    {
		mCount =0;
	}
	void operator()(int val)
    {
		cout << val <<" ";
		mCount++;
	}
	int mCount;
};

//for_each返回值
void test02()
{
	vector<int> v;
	for(int i =0; i <10; i++)
    {
		v.push_back(i);
	}

	print03 p = for_each(v.begin(), v.end(), print03());
	cout << endl;
	cout << p.mCount << endl;
}

for_each 绑定参数输出:

struct print04 :public binary_function<int,int,void>
{
	void operator()(int v1,int v2)const
    {
		cout << v1 + v2 <<" ";
	}
};
void test03()
{	
	vector<int> v;
	for(int i =0; i <10; i++)
    {
		v.push_back(i);
	}

	for_each(v.begin(), v.end(), bind2nd(print04(),100));
}

(2)transform:

/*
	transform算法 将指定容器区间元素搬运到另一容器中
	注意 : transform 不会给目标容器分配内存,所以需要我们提前分配好内存
	@param beg1 源容器开始迭代器
	@param end1 源容器结束迭代器
	@param beg2 目标容器开始迭代器
	@param _callback 回调函数或者函数对象
	@return 返回目标容器迭代器
*/
transform(iterator beg1, iterator end1, iterator beg2, _callback);

	template<class _InIt, class _OutIt, class _Fn1> inline 
	_OutIt _Transform(_InIt _First, _InIt _Last,_OutIt _Dest, _Fn1 _Func)
	{	

		for (; _First != _Last; ++_First, ++_Dest)
			*_Dest = _Func(*_First);
		return (_Dest);
	}

	template<class _InIt1,class _InIt2,class _OutIt,class _Fn2> inline
	_OutIt _Transform(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _OutIt _Dest, _Fn2 _Func)
	{	
		for (; _First1 != _Last1; ++_First1, ++_First2, ++_Dest)
			*_Dest = _Func(*_First1, *_First2);
		return (_Dest);
	}

 transform 将一个容器的值搬运到另一个容器中

 transform 将容器1和容器2中的元素相加后放到目标容器中

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值