STL常用算法
- 一、常用遍历算法
 - 一、for_each 遍历容器
 - 二、transform 搬运容器到另一个容器中
 
- 二、常用查找算法
 - 一、find
 - 二、find_if
 - 三、adjacent_find
 - 四、binary_search
 - 五、count
 - 六、count_if
 
- 三、常用排序算法
 - 一、sort
 - 二、random_shuffle
 - 三、 merage
 - 四、reverse
 
- 四、常用拷贝和替换算法
 - 一、copy
 - 二、replace
 - 三、replace_if
 - 四、swap
 
- 五、常用算术生成算法
 - 一、accumulate
 - 二、fill
 
- 六、常用集合算法
 - 一、set_intersection
 - 二、set_union
 - 三、set_difference
 
一、常用遍历算法
算法主要是由头文件 组成。
 是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、追历操作、复制、修改等等。
 体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
 定义了—些模板类.用以声明函数对象。
一、for_each 遍历容器
样例如下,这也是我们在做项目中常用的一种算法:
//回调函数实现
void print1(int val)
{
	cout << val << " ";
}
//仿函数实现
class print2
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test08()
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	for_each(v.begin(), v.end(), print1);
	for_each(v.begin(), v.end(), print2());
}
 
二、transform 搬运容器到另一个容器中
transform( iterator beg1,iterator end1,iterator beg2,_func) ;
 具体的案例如下:
//函数实现
void print1(int val)
{
	cout << val << " ";
}
//仿函数实现
class Transform
{
public:
	int operator()(int val)
	{
		return val;
	}
};
void test08()
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	vector<int> v2;
	v2.resize(v.size());//目标容器需要提前开辟空间
	transform(v.begin(), v.end(), v2.begin(), Transform());
	for_each(v.begin(), v.end(), print1);
 
二、常用查找算法
下面为函数实现的接口:
 find 查找元素
 find_if 按条件查找元素
 adjacent_find 查找相邻重复元素
 binary _search 二分查找法
 count 统计元素个数
 count_if 按条件统计元素个数
一、find
查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
 函数原型:
 find(iterator beg, iterator end, value);
 按值查找元素,找到返回指定位位置迭代器,找不到返回结束迭代器位置
 beg 开始迭代器
 end结束迭代器
 value查找的元素
 案例一:
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	vector<int>::iterator pos = find(v.begin(), v.end(), 10);
	cout << *pos << endl; 
 
案例二:
class Person
{
public:
	Person(string name, int age)
	{
		this->M_Age = age;
		this->M_Name = name;	
	}
	bool operator == (const Person & p)
	{
		if (this->M_Name == p.M_Name && this->M_Age == p.M_Age)
		{
			return true;
		}
		else
		{
			return false;
		}
	};
	string M_Name;
	int M_Age;
};
void test08()
{
	Person p1("张三", 10);
	Person p2("里斯", 20);
	Person p3("王五", 30);
	Person p4("找刘", 40);
	vector<Person> v;
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	vector<Person>::iterator pos = find(v.begin(), v.end(), p2);
	cout << (*pos).M_Age << endl;
}
 
二、find_if
find_if(iterator beg, iterator end,_pred);
 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置beg 开始迭代器
 end结束迭代器
 _Pred函数或者谓词(返回bool类型的仿函数)
 具体案例如下:
//创建一个人类
class Person
{
public:
	Person(string name, int age)
	{
		this->M_Age = age;
		this->M_Name = name;	
	}
	string M_Name;
	int M_Age;
};
//创建一个仿函数
class MyCompare
{
public:
	bool operator()(Person &p)
	{
		return p.M_Age > 10;	
	}
};
void test08()
{
	//实例化人
	Person p1("张三", 10);
	Person p2("里斯", 20);
	Person p3("王五", 30);
	Person p4("找刘", 40);
	//放入容器
	vector<Person> v;
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	//查找符合条件的人
	vector<Person>::iterator pos = find_if(v.begin(), v.end(), MyCompare());
	//如果存在则打印
	if (pos != v.end())
	{
		cout << (*pos).M_Age << endl;
	}	
	//不存在
	else
	{
		cout << "不存在" << endl;
	}
}
 
三、adjacent_find
查找相邻重复元素
 adjacent_find(iterator beg, iterator end) ;
 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
 beg开始迭代器
 end结束迭代器
 优于语法比较简单,这里就不在进行演示了。
四、binary_search
查找指定元素是否存在
 bool binary_search(iterator beg, iterator end, value);
 查找指定的元素,查到返回true否则false
 beg开始迭代器
 end结束迭代器
 value查找的元素
 **注意在无序序列中不可用!**如果序列是无序的,则结果未知。也许对也许错。
五、count
统计元素个数
 count(iterator beg,iterator end, value);统计元素出现次数
 beg 开始迭代器
 end结束迭代器
 value 统计的元素
 注意在统计自定义数据类型时,要重载==号才可以进行对比,且在传参数的时候要用const类型的数据类型。
六、count_if
按条件统计元素个数
 count_if(iterator beg,iterator end,_Pred);
 beg开始迭代器
 end结束迭代器
 _Pred谓词
 具体的语法与find_if相似,请参照上文
三、常用排序算法
sort 对容器内元素进行排序
 random_shuffle 洗牌 指定范围内的元素随机调整次序
 merge 容器元素合并,并存储到另一容器中
 reverse 反转指定范围的元素
一、sort
对元素进行排序
 sort(iterator beg, iterator end,_Pred ) ;
 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
 beg开始迭代器
 end 结束迭代器
 _Pred 谓词
sort(v.begin(), v.end(), greaner<int>())
 
这里语法例子就不在列举,有兴趣的伙伴可以参考之前的内容: 第四部分
二、random_shuffle
洗牌: 指定范围内的元素随机调整次序
 randomn_shuffle( iterator beg, iterator end);
 beg开始迭代器
 end 结束迭代器
 样例过于简单就不再写样例,有兴趣的小伙伴可以自行练习。
 注意在使用前要加一个随机数种子,才能实现每次运行都是随机的状态:
srand((unsigned int)time(NULL));
 
三、 merage
两个容器元素合并,并存储到另一个容器中
 merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
 beg1容器1开始迭代器
 end1容器1结束迭代器
 beg2容器2开始迭代器
 end2客器2结束迭代器
 dest目标容器开始迭代器
 合并时两个容器必须是有序的,合并之后的序列仍然是有序的!
 注意在合并之前要给目标容器提前开辟空间,否则会抛出异常!
vTarget.resize(v1.size() + v2.size());
 
四、reverse
将容器内元素进行反转
 reverse(iterator beg,iterator end);
 beg 开始迭代器
 end结束迭代器
 此函数过于简单就不在描述了
四、常用拷贝和替换算法
copy 容器内指定范围的元素拷贝到另一容器中
 replace 将容器内指定范围的旧元素修改为新元素
 replace_if 容器内指定范围满足条件的元素替换为新元素
 swap 互换两个容器的元素
一、copy
copy (iterator beg,iterator end, iterator dest );
 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位詈
 beg开始迭代器
 end 结束迭代器
 dest目标起始迭代器
 注意在copy之前要给目标容器提前开辟空间,否则会抛出异常!
二、replace
replace(iterator beg,iterator end, old value,new value);
 beg 开始迭代器
 end结束迭代器
 old value 旧元素
 new value新元素
三、replace_if
将区间内满足条件的元素,替换成指定元察
 replace_if(iterator beg,iterator end,_pred,new value);
 beg 开始迭代器
 end结束迭代器
 _pred 谓词
 new value替换的新元素
四、swap
互换两个容器的元素
 Swap(container c1,container c2); 互换两个容器的元素
 c1 容器1
 c2 容器2
 注意一定是同一个类型的容器进行交换,否则会抛出异常!
五、常用算术生成算法
算术生成算法属于小型算法,使用时包含的头文件为#include 算法简介:
 accumulate 计算容器元素累计总和
 fill 向容器中添加元素
一、accumulate
计算区间内容器元素累计总和
 accumulate(iterator beg, iterator end , value);
 beg开始迭代器
 end结束迭代器
 value 起始值:一般为零
二、fill
向容器中添加元素
 fill(iterator beg, iterator end, value) ;
 beg 开始迭代器
 end结束迭代器
 value填充的值
六、常用集合算法

set_intersection 求两个容器的交集
 set_union 求两个容器的并集
 set_difference 求两个容器的差集
一、set_intersection
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
 beg1容器1开始迭代器
 end1容器1结束迭代器
 beg2容器2开始迭代器
 end2容眙2结束迭代器
 dest目标容器开始迭代器
 注意:两个集合必须是有序序列!
 特殊情况下,两个集合最大的交集是其中最小集合的全部。
v.reszie(min(v1.size(), v2.size()))
 
二、set_union
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
 beg1容器1开始迭代器
 end1容器1结束迭代器
 beg2容器2开始迭代器
 end2容器2结束迭代器
 dest目标容器开始迭代器
 注意:两个集合必须是有序序列!
 特殊情况下,两个集合最大的并集是两个集合之和。
 set_union返回值既是并集中最后一个元素的位置
三、set_difference
set_difference( iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
 beg1容器1开始迭代器
 end1容器1结束迭代器
 beg2容器2开始迭代器
 end2容器2结束迭代器
 dest目标容器开始迭代器
 注意:两个集合必须是有序序列!
 特殊情况下,两个集合最大的差集是两个集合最大的一个。
![推荐系统遇上深度学习(一四三)-[快手]一致性终身用户行为建模方法TWIN](https://img-blog.csdnimg.cn/img_convert/5a570c24ca54e61b7739a8efb6b8bca6.jpeg)


















