C++ STL(十二):常用遍历算法(for_each、transform)


0 STL算法

STL算法主要由<algorithm> <functional> <numeric>头文件组成。
<algorithm>:包括遍历、查找、排序、比较、交换、复制、修改等操作的函数模板。
<functional>:包括函数对象/仿函数相关的类模板。
<numeric>:体积较小,仅包括简单数学运算相关的函数模板。


1 常用遍历算法简介【for_each、transform】

算法简介
for_each:遍历容器元素及统一逻辑处理。
transform:将源容器的元素全部拷贝至目标容器。


2 for_each【遍历容器元素及统一逻辑处理】

作用:遍历容器元素及统一逻辑处理。

注:使用for_each算法时,需包含头文件include <algorithm>

函数原型:
for_each(iterator begin, iterator end, _func);

参数解释
begin:迭代器起始位置;
end:迭代器结束位置;
_func:对当前所遍历的容器元素的处理。
①普通回调函数;
②函数对象/仿函数;
③匿名函数(lambda表达式)。

示例

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用for_each算法

//普通回调函数
void print(int val) {
    
    
	cout << val << " ";
}

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

int main() {
    
    
	vector<int> v;

	v.push_back(9);
	v.push_back(1);
	v.push_back(7);
	v.push_back(6);
	v.push_back(3);

	/* 遍历容器元素 */
	//1.for_each算法 + 普通回调函数————传递函数名
	for_each(v.begin(), v.end(), print);		//9 1 7 6 3
	
	//2.for_each算法 + 函数对象/仿函数————传递匿名函数对象
	for_each(v.begin(), v.end(), Printer());	//9 1 7 6 3
	
	//3.for_each算法 + 匿名函数(lambda表达式)
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//9 1 7 6 3

	/* 对容器元素的统一逻辑处理 */ 
	//全部容器元素的值减1后输出
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val - 1 << " "; });	//8 0 6 5 2

	return 0;
}

3 transform【将源容器的元素全部拷贝至目标容器】

作用:将源容器的元素全部拷贝至目标容器。

注1:使用transform算法时,需包含头文件include <algorithm>
注2:使用transform算法时,需为目标容器提前开辟内存空间,如dest.resize(src.size());,否则程序运行时崩溃。

函数原型
transform(iterator begin1, iterator end1, iterator begin2, _func);

参数解释
begin1:源容器迭代器起始位置;
end1:源容器迭代器结束位置;
begin2:目标容器迭代器起始位置;
_func:对当前遍历容器元素的逻辑运算处理。
①普通回调函数;
②函数对象/仿函数;
③匿名函数(lambda表达式)。

示例

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用transform算法

//普通回调函数
int print(int val) {
    
    
	//元素值加10
	return val + 10;
}

//函数对象/仿函数
class Printer {
    
    
public:
	int operator()(int val) {
    
    
		//直接返回元素
		return val;
	}
};

int main() {
    
    
	vector<int> src;

	for(int i = 0; i < 5; i++){
    
    
		src.push_back(i);
	}

	/* 拷贝容器的全部元素,必须为目标容器提前开辟内存空间 */
	vector<int> dest;
	dest.resize(src.size());

	//1.transform算法 + 普通回调函数————传递函数名
	transform(src.begin(), src.end(), dest.begin(), print);
	for_each(dest.begin(), dest.end(), [](int val) {
    
    cout << val << " "; });	//10 11 12 13 14

	//2.transform算法 + 函数对象/仿函数————传递匿名函数对象
	transform(src.begin(), src.end(), dest.begin(), Printer());
	for_each(dest.begin(), dest.end(), [](int val) {
    
    cout << val << " "; });	//0 1 2 3 4

	//3.transform算法 + 匿名函数(lambda表达式)
	transform(src.begin(), src.end(), dest.begin(), [](int val) {
    
    return val + 20; });
	for_each(dest.begin(), dest.end(), [](int val) {
    
    cout << val << " "; });	//20 21 22 23 24

	return 0;
}

猜你喜欢

转载自blog.csdn.net/newson92/article/details/114242754