STL——常用遍历算法

本文深入探讨了C++标准库中的for_each和transform两个算法。for_each用于对容器中的每个元素应用指定函数或函数对象,如示例中展示了使用普通函数print和仿函数print1遍历并打印整数向量。transform则将操作应用于一个容器的元素,并将结果存储到另一个容器,例子中展示了如何使用transform1函数对象将原向量元素复制到新向量。

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

for_each(iterator beg,iterator end,_func)

beg开始迭代器

end结束迭代器

——func函数或函数对象

	#include <iostream>
	#include<vector>
	#include<algorithm>
	using namespace std;
	//for_each遍历算法
	void print(int val)
	{
		cout << val << " ";
	}

	class print1
	{
	public:
		void operator()(int val)
		{
			cout << val << " ";
		}
	};
	void test1()
	{
		vector<int>v;
		v.push_back(1);
		v.push_back(2);
		v.push_back(2);
		v.push_back(3);
		
		//用普通函数
		for_each(v.begin(), v.end(), print);
		//用仿函数
		for_each(v.begin(), v.end(), print1());
	}

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

beg1原容器起始位置

end1原容器终止位置

beg2接收容器起始位置

_func运算函数

	#include <iostream>
	#include<vector>
	#include<algorithm>
	using namespace std;
	//transform遍历算法
	class transform1
	{
	public:
		int operator()(int v)
		{
			return v;
		}
	};


	void test1()
	{
		vector<int>v;
		v.push_back(1);
		v.push_back(2);
		v.push_back(3);
		v.push_back(4);
		
		vector<int>v2;
		//目标容器需要提前开辟空间
		v2.resize(v.size());
		transform(v.begin(), v.end(), v2.begin(), transform1());
	}

### C++ 常用 STL 算法概述 C++ 的标准模板库 (STL) 提供了许多高效且易于使用的算法,这些算法被封装在不同的头文件中。`<algorithm>` 是所有 STL 头文件中最大的一个,涵盖了广泛的用途,包括但不限于比较、交换、查找、遍历操作、复制和修改等[^2]。 #### 排序算法 `std::sort` `std::sort` 函数用于对给定区间内的元素进行排序,默认按照升序排列。此函数采用的是快速排序的变种—— introsort,在大多数情况下具有 O(n log n) 的时间复杂度。 ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {5, 3, 7, 6, 4}; // 对向量中的元素从小到大排序 std::sort(vec.begin(), vec.end()); for(auto &v : vec){ std::cout << v << " "; } } ``` #### 随机打乱顺序 `std::random_shuffle` 该函数可以随机改变指定范围内元素的位置,使得原本有序的数据变得无序。需要注意的是自 C++14 起推荐使用 `std::shuffle` 来替代它,并需提供额外的随机数引擎参数。 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <ctime> int main(){ srand((unsigned int)time(0)); std::vector<int> vec = {1, 2, 3, 4, 5}; // 打乱vec内元素位置 std::random_shuffle(vec.begin(), vec.end()); for(int i=0;i!=vec.size();++i) std::cout<<vec[i]<<" "; } ``` #### 合并两个已排序序列 `std::merge` 当有两个已经各自排好序的数组时,可以通过这个方法将它们合并成一个新的有序列表而不需要重新全部排序。这通常会更加快捷有效率。 ```cpp #include <iostream> #include <vector> #include <iterator> #include <algorithm> int main(){ std::vector<int> first = {1, 3, 5}; // 已经按升序排列的第一组数据 std::vector<int> second = {2, 4, 6}; // 已经按升序排列的第二组数据 std::vector<int> result(first.size()+second.size()); // 将first与second的内容合并至result中形成新的升序序列 std::merge(first.begin(), first.end(), second.begin(), second.end(), result.begin()); for(const auto& elem:result){ std::cout<<elem<<" "; } } ``` #### 反转容器内容 `std::reverse` 如果想要反转某个容器内部存储的所有项目,则可以直接调用此函数来完成任务。这对于实现某些特定逻辑非常有用。 ```cpp #include <iostream> #include <vector> #include <algorithm> int main(){ std::vector<int> myVec{1, 2, 3, 4, 5}; // 把myVec里的元素反向排列 std::reverse(myVec.begin(), myVec.end()); for(size_t idx=0;idx<myVec.size();idx++){ std::cout<<myVec[idx]<<' '; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值