STL常用算法

算法概述

算法主要是有头文件<algorithm> <functional> <numeric>组成
<algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及比较,交换,查找遍历,复制,修改,反转,排序,合并等。
<numeric>体积很小,只包括在几个序列容器上进行简单运算的额模板函数。
<functional>定义了一些模板类,用以声明函数对象。

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

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

//An highlighted block
void Print(int val)
	{
		cout << val << endl;
	}

class Print1
	{
	public:
		void operator () (int val)
			{
			cout << val << endl;
			}
	};
void test1()
	{
	vector<int> v;
	for (int i = 0;i<10;i++)
	{
		v.push_back(i);
	}

	for_each(v.begin(),v.end(),Print);

	cout << "--------------------------" << endl;

	for_each(v.begin(),v.end(),Print1());
	
	}

在这里插入图片描述

//An highlighted block
//for_each可以保存内存记录
//for_each有返回值

struct Print2
	{
	void operator()(int val)
		{
		cout << val << endl;
		num++;
		}
	int num;
	};

void test2()
	{
	vector<int>v;
	for (int i = 0;i<10;i++)
	{
		v.push_back(i);
	}
	Print2 p = for_each(v.begin(),v.end(),Print2());
	cout <<"num=" << p.num << endl;

	}

在这里插入图片描述

//An highlighted block
//for_each可以绑定参数进行输出
struct Print3 :public binary_function<int,int,void>
{
	void operator() (int val1 ,int val2) const
		{
		cout << "第一个参数是:" << val1 << "第二个参数是:" << val2 << "和为:" << val1 + val2 << endl;
		}

};

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

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

在这里插入图片描述

//An highlighted block
class Transform
	{
	public:
		int operator ()(int val)
			{
				return val;
			}
	};

void test4()
	{
	vector<int>v;
	for (int i = 0;i < 10;i++)
		{
		v.push_back(i);
		}
	vector<int> v2;		//目标容器
	v2.resize(v.size());		//分配内存
	transform(v.begin(),v.end(),v2.begin(),Transform());
	for_each(v2.begin(),v2.end(),[](int val){cout << val << " ";});

	}

在这里插入图片描述

//An highlighted block
//transform第二种用法  将两个容器数据相加搬运到目标容器
class Transform2
	{
	public:
		int operator ()(int val1,int val2)
			{
			return val1 + val2;
			}
	};

void test5()
	{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0;i < 10;i++)
		{
		v1.push_back(i);
		v2.push_back(i+10);
		}
	vector<int>v3;
	v3.resize(v1.size());

	transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),Transform2());
	for_each(v3.begin(),v3.end(),[](int val){cout << val << " ";});
	}

在这里插入图片描述

2常用查找算法
find 算法 查找元素
@param beg容器开始迭代器
@param end容器结束迭代器
@param value 查找的元素
@return 返回查找元素的位置
find(iterator beg,iterator end,value)

find_if算法 条件查找
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
@return bool 查找返回true 否则返回false
find_if(iterator beg,iterator end,_callback)

adjacent_find算法 查找相邻重复元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
@return 返回相邻元素的第一个位置的迭代器
adjacent_find(iterator beg,iterator end,_callback)

//An highlighted block


void test1()
	{
	vector<int> v;
	for (int i = 0;i <10; i++)
	{
		v.push_back(i);
	}
	vector<int>::iterator pos = find(v.begin(),v.end(),5);
	if (pos != v.end())
	{
		cout << "找到了数据:" << *pos << endl;
		cout << "在第" << pos - v.begin() +1 << "个位置" << endl;
	} 
	else
	{
		cout << "没有找到"  << endl;
	}
	}

在这里插入图片描述

//An highlighted block
//利用find查找自定义的数据类型
class Person
	{
	public:
		Person(string name,int age)
			{
				this->_Name= name;
				this->_Age = age;
			}

		bool operator == (const Person &p)
			{
				if (this ->_Name == p._Name && this->_Age == p._Age)
				{
				return true;
				}
				return false;
			}
		string _Name;\
		int _Age;
	};




void test2()
	{
		vector<Person> v;
		Person p1("ac",11);
		Person p2("edf",1);
		Person p3("ghi",8);
		Person p4("lk",22);
		Person p5("sis",19);

		v.push_back(p1);
		v.push_back(p2);
		v.push_back(p3);
		v.push_back(p4);
		v.push_back(p5);

		vector<Person>::iterator it = find(v.begin(),v.end(),p2);
		if (it != v.end())
		{
			cout << "找到了,姓名是:" << (*it)._Name << "  年龄是:"  << it ->_Age << endl; 
		} 
		else
		{
			cout << "没有找到" << endl;
		}

	}

在这里插入图片描述

//An highlighted block

class myCompare : public binary_function<Person*,Person*,bool>
	{
	public:
		bool operator ()(Person *p1,Person * p2) const
			{
				if (p1->_Name ==  p2 ->_Name && p1->_Age == p2->_Age )
				{
					return true;
				}
				return false;
			}
	};
void test3()
	{

	vector<Person*> v;
	Person p1("ac",11);
	Person p2("edf",1);
	Person p3("ghi",8);
	Person p4("lk",22);
	Person p5("sis",19);

	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	v.push_back(&p4);
	v.push_back(&p5);

	Person *p = new Person("ac",11);
	vector<Person*>::iterator pos = find_if(v.begin(),v.end(),bind2nd(myCompare(),p));
	if (pos != v.end())
		{
		cout << "找到了,姓名是:" << (*pos)->_Name << "  年龄是:"  << (*(*pos))._Age<< endl; 
		} 
	else
		{
		cout << "没有找到" << endl;
		}
	}

在这里插入图片描述

//An highlighted block

void test4()
	{
		vector<int> v;
		v.push_back(10);
		v.push_back(10);
		v.push_back(10);
		v.push_back(30);
		v.push_back(40);
		v.push_back(30);
		v.push_back(30);

		vector<int>::iterator it = adjacent_find(v.begin(),v.end());
		//vector<int>::iterator it = adjacent_find(v.begin(),v.end(),[](int val1,int val2){return val1 == val2;});
		if (it != v.end())
		{
			cout << "找到了" << *it << endl;
		} 
		else
		{
			cout << "没有找到" << endl;
		}
	}

在这里插入图片描述binary_search算法 二分查找法
注意:在无序序列中不可用
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return bool 查找返回true 否则返回false
bool binary_search(iterator beg,iterator end,value)

count算法 统计元素出现次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
@return int 返回元素个数
count_if(iterator beg,iterator end,_callback)

//An highlighted block
void test5()
	{
		vector<int> v;
		for (int i = 0; i < 10; i++)
		{
			v.push_back(i);
		}

		bool a = binary_search(v.begin(),v.end(),4);
		if(a)
			{
			cout << "找到了4" << endl;
			}
		else
			{
				cout << "没有找到" << endl;
			}

	}



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

	int num = count(v.begin(),v.end(),4);
	cout << "4一共有" << num << "个" << endl;

	int num2 = count_if(v.begin(),v.end(),[](int val1){return val1 < 4;});
	cout << "小于4一共有:" << num2 <<"个" << endl;
	}

在这里插入图片描述
3常用排序算法
merge算法 容器元素合并 并存储到另一容器中 这两个容器必须是有序的
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器 需要提前分配好目标容器的内存
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

sort算法 容器元素排序
注意:两个容器必须是有的
@param beg 容器1开始迭代器
@param end 容器1结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
sort(iterator beg,iterator end,_callback)

random_shuffle算法 对指定范围内的元素随机排序 和rand一样 配合srand使用
@param beg 容器开始迭代器
@param end 容器结束迭代器
random_shuffle(iterator beg,iterator end)

reverse 算法 反转指定范围的元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
reverse(iterator beg,iterator end)

//An highlighted block
void test1()
	{
		vector<int> v1;
		vector<int> v2;
		vector<int> v3;

		for (int i = 0; i<10;i++)
		{
			v1.push_back(i+10);
			v2.push_back(i+11);
		}
		v3.resize(v1.size() + v2.size());
		merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
		for_each(v3.begin(),v3.end(),[](int val){cout << val << " ";});
	}

在这里插入图片描述

//An highlighted block
void test2()
	{
		vector<int> v;
		v.push_back(10);
		v.push_back(70);
		v.push_back(40);
		v.push_back(90);
		v.push_back(20);
		v.push_back(40);
		v.push_back(30);

		sort(v.begin(),v.end());
		for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
		cout << endl;

		cout << "-------------------------------" << endl;
		sort(v.begin(),v.end(),greater<int>());
		for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
		cout << endl;


	}

在这里插入图片描述

//An highlighted block
/*
random_shuffle(iterator beg,iterator end) 洗牌 配合srand使用
*/

void test3()
	{
		vector<int> v;
		for (int i = 0;i<10;i++)
		{
			v.push_back(i);
		}
		random_shuffle(v.begin(),v.end());
		for_each(v.begin(),v.end(),[](int val){cout << val << " ";});


	}

在这里插入图片描述

//An highlighted block
/*
reverse 算法 反转指定范围的元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
reverse(iterator beg,iterator end)
*/

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

	reverse(v.begin(),v.end());
	for_each(v.begin(),v.end(),[](int val){cout << val << " ";});


	}

在这里插入图片描述4常用拷贝和替换算法

copy算法 将容器内指定范围的元素拷贝到另一容器中
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param dest 目标其实迭代器
copy(iterator beg,iterator end,iterator dest)

replace算法 将容器内指定范围的旧元素改为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param oldvalue 旧元素
@param newvalue 新元素
replace(iterator beg,iterator end,oldvalue,new value)

replace_if 算法 将容器内指定范围满足条件的元素替换为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 函数回调或者谓词(返回bool类型的函数对象)
@param newvalue 新元素
replace_if(iterator beg,iterator end,_callback,newvalue)

swap 算法 互换两个容器的元素
@param c1 容器1
@param c2 容器2
swap(container c1,container c2)

//An highlighted block
/*
copy算法 将容器内指定范围的元素拷贝到另一容器中
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param dest 目标其实迭代器
copy(iterator beg,iterator end,iterator dest)
*/


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

		v1.resize(v.size());
		copy(v.begin(),v.end(),v1.begin());
		for_each(v1.begin(),v1.end(),[](int val){cout << val << " ";});

		cout << endl;

		copy(v1.begin(),v1.end(),ostream_iterator<int>(cout ," "));
		cout << endl;
	}

在这里插入图片描述

//An highlighted block

/*
replace算法 将容器内指定范围的旧元素改为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param oldvalue 旧元素
@param newvalue 新元素
replace(iterator beg,iterator end,oldvalue,new value)


replace_if 算法 将容器内指定范围满足条件的元素替换为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 函数回调或者谓词(返回bool类型的函数对象)
@param newvalue 新元素
replace_if(iterator beg,iterator end,_callback,newvalue)

*/
class Mycompare
	{
	public:
		bool operator ()(int val)
			{
			return val > 3;
			}
	};

void test2()
	{
	vector<int> v;
	for (int i = 0;i<10;i++)
		{
		v.push_back(i);
		}
	//需求 把容器中的3替换为300
	replace(v.begin(),v.end(),3,300);
	for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
	cout << endl;


	//需求 把容器中所有大于3的数字 都换成3000
	replace_if(v.begin(),v.end(),Mycompare(),3000);
	copy(v.begin(),v.end(),ostream_iterator<int>(cout ," "));
	cout << endl;

	}

在这里插入图片描述

//An highlighted block

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

		vector<int> v2;
		v2.push_back(100);
		v2.push_back(200);
		v2.push_back(300);
		v2.push_back(400);
		v2.push_back(500);
		cout << "交换前" << endl;
		cout << "v1:" ;
		copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
		cout << endl << "v2:" ;
		for_each(v2.begin(),v2.end(),[](int val){cout << val << " ";});
		cout << endl;


		swap(v1,v2);
		cout << "交换后" << endl;
		cout << "v1:" ;
		copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
		cout << endl << "v2:" ;
		for_each(v2.begin(),v2.end(),[](int val){cout << val << " ";});
		cout << endl;


	}

在这里插入图片描述

5常用算数生成算法
accumulate 算法 计算容器元素累计总和 头文件#include
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 起始累加值
accumulate(iterator beg,iterator end,value)

fill算法 向容器中添加元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 填充元素
fill(iterator beg,iterator end,value)

//An highlighted block
void test1()
	{
	vector<int> v;
	for (int i = 0; i<= 100;i++)
	{
		v.push_back(i);
	}
	//0到100的累加和
	//第三个参数  起始累加值
	int num = accumulate(v.begin(),v.end(),0);
	cout << "总和为:" << num << endl;
	}

在这里插入图片描述

//An highlighted block
void test2()
	{
	vector<int>v;
	v.resize(10);
	fill(v.begin(),v.end(),1);
	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
	}

在这里插入图片描述6常用集合算法
set_intersection 算法 求两个set集合的交集(相同的部分)
注意:两个集合必须是有序序列
@param beg1 容器1的开始迭代器
@param end1 容器1的结束迭代器
@param beg2 容器2的开始迭代器
@param end2 容器2的结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

set_union 算法 求两个set集合的并集(合起来去掉重复的元素)
注意:两个集合必须是有序序列
@param beg1 容器1的开始迭代器
@param end1 容器1的结束迭代器
@param beg2 容器2的开始迭代器
@param end2 容器2的结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

set_difference 算法 求两个set集合的差集
注意:两个集合必须是有序序列
@param beg1 容器1的开始迭代器
@param end1 容器1的结束迭代器
@param beg2 容器2的开始迭代器
@param end2 容器2的结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

//An highlighted block
void test1()
	{
	vector<int> v1;
	vector<int> v2;

	for (int i = 0; i<10;i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "v1的元素:";
	copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
	cout << endl << "v2的元素:" ;
	copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
	cout << endl;

	vector<int> d;
	d.resize( min(v1.size() , v2.size()) );
	vector<int>::iterator itEnd = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),d.begin());

	cout << "v1和v2的交集为:" ;
	copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
	cout << endl;
	}

在这里插入图片描述

//An highlighted
void test2()
	{
	vector<int> v1;
	vector<int> v2;

	for (int i = 0; i<10;i++)
		{
		v1.push_back(i);
		v2.push_back(i + 5);
		}

	cout << "v1的元素:";
	copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
	cout << endl << "v2的元素:" ;
	copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
	cout << endl;

	vector<int> d;
	d.resize(v1.size() + v2.size()  );
	vector<int>::iterator itEnd = set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),d.begin());

	cout << "v1和v2的并集为:" ;
	copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
	cout << endl;

	}

在这里插入图片描述

//An highlighted block
void test3()
	{
	vector<int> v1;
	vector<int> v2;

	for (int i = 0; i<10;i++)
		{
		v1.push_back(i);
		v2.push_back(i + 5);
		}

	cout << "v1的元素:";
	copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
	cout << endl << "v2的元素:" ;
	copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
	cout << endl;

	vector<int> d;
	d.resize(max(v1.size(),v2.size()) );

	//v1在前就是v1差v2
	vector<int>::iterator itEnd = set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),d.begin());

	cout << "v1差v2的差集为:" ;
	copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
	cout << endl;

	

	itEnd = set_difference(v2.begin(),v2.end(),v1.begin(),v1.end(),d.begin());

	cout << "v2差v1的差集为:" ;
	copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
	cout << endl;
	}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值