STL常用算法(循环,查询,计数,比较)

//循环,查询,计数,比较

序号功能函数名称说明 
1循环for_each遍历容器元素,对每个元素执行相同的操作 
2查询find在单迭代器序列中找出某个值第一次出现的位置 
find_if在单迭代器序列中找出符合某谓词的第一个元素 
find_first_of在双迭代器序列中找出子序列中某元素第一次出现的位置 
adjacent_find在单迭代器序列中找出第一次相邻值相等元素出现的位置 
find_end在双迭代器序列中找出子序列中最后一次出现的位置 
search在双迭代器序列中找出子序列中第一次出现的位置 
search_n在单迭代器序列中找出某个值连续出现n次出现的位置 
3计数count在序列中统计某个值出现的次数 
count_if在序列中统计某个值与某谓词(表达式)匹配的次数 
4比较equal在两个序列中对应元素都相同时为真 
mismatch找出两个序列相异的第一个元素 
     

#include"iostream"
#include"vector"
#include"algorithm"
#include"functional"
#include"string"
#include"iterator"
using namespace std;
/*for_each和transform*/
/* for_each: 用指定函数依次对指定范围内所有元素进行迭代访问。 该函数不得修改
序列中的元素。
 函数定义。 For_each(begin, end, func);
*/
void print(int &a)
{
	cout << a << " ";
}
template <class T>
class paixu
{
public:
	paixu()
	{
		num = 0;
	}
public:
	
	bool operator()(T &a)
	{
		num++;
		cout << a << " ";
		return (a < 10);
	}
	void printnum()
	{
		cout << "num: " << num<<endl;
	}
private:
	int num;
};
/* transform: 与 for_each 类似, 遍历所有元素, 但可对容器的元素进行修改
 transform()算法有两种形式:
 transform(b1, e1, b2, op)
 transform(b1, e1, b2, b3, op)
可以一个容器的元素, 通过 op, 变换到另一个容器中(同一个容器中)
也可以把两个容器的元素, 通过 op, 变换到另一个容器中
*/
int increase(int n)
{
	return  n + 100;
}
void printf(vector<int>& v2)
{
	for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main01()
{//for_each
/*template<class _InIt,
	class _Fn1> inline
	_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
	{	// perform function for each element
	_DEBUG_RANGE(_First, _Last);
	_DEBUG_POINTER(_Func);
	_For_each(_Unchecked(_First), _Unchecked(_Last), _Func);

	return (_STD move(_Func));
	}
	*/
	cout << "for_each: " << endl;
	vector<int>v1;
	for (int i = 0; i < 20; i++)
	{
		v1.push_back(rand()%100);
	}
	//函数对象、回调函数入口地址(函数必须有且只有一个参数)
	for_each(v1.begin(),v1.end(),print);//41 67 34 0 69 24 78 58 62 64 5 45 81 27 61 91 95 42 27 36
	cout << endl;
	paixu<int> p=for_each(v1.begin(), v1.end(), paixu<int>());
	p.printnum();
	cout << endl;

//transform
	cout << "transform: " << endl;
	vector<int>v2 = v1;
	//回调函数
	cout << "回调函数+100: " << endl;
	transform(v2.begin(), v2.end(), v2.begin(), increase);
	printf(v2);
	//预定义函数对象
	cout << "预定义函数对象取反: " << endl;
	transform(v2.begin(), v2.end(), v2.begin(), negate<int>());
	printf(v2);
	//函数适配器
	cout << "函数适配器*10: " << endl;
	transform(v2.begin(),v2.end(),v2.begin(),bind2nd(multiplies<int>(),10));
	printf(v2);
	//把结果输出到屏幕
	cout << "把结果输出到屏幕/10取反: " << endl;
	transform(v2.begin(), v2.end(), v2.begin(), negate<int>());
	printf(v2);
	transform(v2.begin(), v2.end(),ostream_iterator<int>(cout," "), bind2nd(divides<int>(), 10));
	
	return 0;
//for_each和transform的区别(请看源码)
//一般情况下: for_each 所使用的函数对象, 参数是引用, 没有返回值
// transform 所使用的函数对象, 参数一般不使用引用, 而是还有返回值
}
//查询算法//
/*函数有:find、find_if、find_first_of、adjacent_find、find_end、search、search_n、binary_search*/
void a_print(int &n)
{
	cout << n << " ";
}
bool a_print_3(int &n)
{
	if (n > 3)
		return true;
	else
		return false;
}
void main02()
{
	int a[] = {1,2,3,3,3,4,5,6,7,8,8,9 };
	int b[] = {3,4,5};
	vector<int>v1(a, a + sizeof(a) / sizeof(int));
	vector<int>v2(b, b + sizeof(b) / sizeof(int));
	for_each(v1.begin(),v1.end(),a_print);
	cout << endl;
	vector<int>::iterator  find1 = find(v1.begin(), v1.end(), 5);
	cout << "输出=5第一次出现的位置和值:" << distance(v1.begin(), find1)<<","<<*find1 << endl;//6,5
	vector<int>::iterator  findif1 = find_if(v1.begin(),v1.end(),a_print_3);
	cout << "输出>3第一次出现的位置和值:" << distance(v1.begin(), findif1)<<" ," << *findif1 << endl;//5,4
	vector<int>::iterator find_first_of1 = find_first_of(v1.begin(),v1.end(),v2.begin(),v2.end());
	cout << "输出v2某元素第一次出现的位置和值:" << distance(v1.begin(), find_first_of1) << " ," << *find_first_of1 << endl;
	vector<int>::iterator adjacent1 = adjacent_find(v1.begin(),v1.end());//2,3(返回第一个3的位置)
	cout << "第一次出现相邻值相等的元素的位置和值:" << distance(v1.begin(), adjacent1) << " ," << *adjacent1 << endl;//2,3
	vector<int>::iterator findend = find_end(v1.begin(), v1.end(), v2.begin(), v2.end());
	cout << "输出v2最后一次完全匹配出现的位置和值:" << distance(v1.begin(), findend) << " ," << *findend << endl;//4,3(返回最后一个3的位置)
	vector<int>::iterator search1 = search(v1.begin(), v1.end(), v2.begin(), v2.end());
	cout << "输出v2首次完全匹配出现的位置和值:" << distance(v1.begin(), search1) << " ," << *search1 << endl;//4,3
	vector<int>::iterator search_n1 = search_n(v1.begin(), v1.end(), 2 ,8);
	cout << "输出v1中2个8出现的位置和值:" << distance(v1.begin(), search_n1) << " ," << *search_n1 << endl;//9,8
	//二分法查找某值,返回值为bool型,且只针对已从小到大排序完成的数组类型
	bool A = binary_search(v1.begin(),v1.end(),5);
	if (A = true)
	{
		cout << "已找到" << endl;
	}
	else
	{
		cout << "未找到" << endl;
	}
}
/计数/
//计数count、count_if
void main03()
{
	int a[] = { 1, 2, 3, 3, 3, 4, 5, 6, 7, 8, 8, 9 };
	vector<int>v1(a,a+sizeof(a)/sizeof(int));
	for_each(v1.begin(), v1.end(), a_print);
	cout << endl;
	int num1 = count(v1.begin(),v1.end(),8);//8的个数
	cout << "=8的个数num1= " << num1 << endl;//2
	int num2 = count_if(v1.begin(), v1.end(), a_print_3);///>3的个数
	cout << ">3的个数num2= " << num2 << endl;//7
}
比较///
//比较equal、mismatch
void main04()
{
	int a[] = {1, 2, 3, 3, 3, 4, 5, 6, 7, 8, 8, 9 };
	int b[] = {1,2, 3, 4, 5, 6, 7, 8, 8 };
	vector<int>v1(a, a + sizeof(a) / sizeof(int));
	vector<int>v2(b, b + sizeof(b) / sizeof(int));
	bool A=equal(v1.begin(),v1.end(),v2.begin());//对应元素相等时为真;
	cout << A << endl;  //0
	pair<vector<int>::iterator, vector<int>::iterator>p = mismatch(v1.begin(), v1.end(), v2.begin());//找出两序列第一对元素不相等的迭代器指针
	cout << "v1位置:" << distance(v1.begin(), p.first) << " " << "v1值:" << *p.first << "\n" << "v2位置:" << distance(v2.begin(), p.second) << " " << "v2值:" << *p.second << endl;//v1位置: 3  v1值:  3  //v2位置: 3  v2值 : 4

}
int main()
{

	//main01();//for_each和transform
	//main02();//查询find、find_if、find_first_of、adjacent_find、find_end、search、search_n、binary_search
	//main03();//计数count、count_if
	main04();//比较equal、mismatch
	system("pause");
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 目录 1 Graph 图论 3 | DAG 的深度优先搜索标记 3 | 无向图找桥 3 | 无向图连通度(割) 3 | 最大团问题 DP + DFS 3 | 欧拉路径 O(E) 3 | DIJKSTRA 数组实现 O(N^2) 3 | DIJKSTRA O(E * LOG E) 4 | BELLMANFORD 单源最短路 O(VE) 4 | SPFA(SHORTEST PATH FASTER ALGORITHM) 4 | 第 K 短路(DIJKSTRA) 5 | 第 K 短路(A*) 5 | PRIM 求 MST 6 | 次小生成树 O(V^2) 6 | 最小生成森林问题(K 颗树)O(MLOGM). 6 | 有向图最小树形图 6 | MINIMAL STEINER TREE 6 | TARJAN 强连通分量 7 | 弦图判断 7 | 弦图的 PERFECT ELIMINATION 点排列 7 | 稳定婚姻问题 O(N^2) 7 | 拓扑排序 8 | 无向图连通分支(DFS/BFS 邻接阵) 8 | 有向图强连通分支(DFS/BFS 邻接阵)O(N^2) 8 | 有向图最小点基(邻接阵)O(N^2) 9 | FLOYD 求最小环 9 | 2-SAT 问题 9 Network 网络流 11 | 二分图匹配(匈牙利算法 DFS 实现) 11 | 二分图匹配(匈牙利算法 BFS 实现) 11 | 二分图匹配(HOPCROFT-CARP 的算法) 11 | 二分图最佳匹配(KUHN MUNKRAS 算法 O(M*M*N)) 11 | 无向图最小割 O(N^3) 12 | 有上下界的最小(最大)流 12 | DINIC 最大流 O(V^2 * E) 12 | HLPP 最大流 O(V^3) 13 | 最小费用流 O(V * E * F) 13 | 最小费用流 O(V^2 * F) 14 | 最佳边割集 15 | 最佳点割集 15 | 最小边割集 15 | 最小点割集(点连通度) 16 | 最小路径覆盖 O(N^3) 16 | 最小点集覆盖 16 Structure 数据结构 17 | 求某天是星期几 17 | 左偏树 合并复杂度 O(LOG N) 17 | 树状数组 17 | 二维树状数组 17 | TRIE 树(K 叉) 17 | TRIE 树(左儿子又兄弟) 18 | 后缀数组 O(N * LOG N) 18 | 后缀数组 O(N) 18 | RMQ 离线算法 O(N*LOGN)+O(1) 19 | RMQ(RANGE MINIMUM/MAXIMUM QUERY)-ST 算法 (O(NLOGN + Q)) 19 | RMQ 离线算法 O(N*LOGN)+O(1)求解 LCA 19 | LCA 离线算法 O(E)+O(1) 20 | 带权值的并查集 20 | 快速排序 20 | 2 台机器工作调度 20 | 比较高效的大数 20 | 普通的大数运算 21 | 最长公共递增子序列 O(N^2) 22 | 0-1 分数规划 22 | 最长有序子序列(递增/递减/非递增/非递减) 22 | 最长公共子序列 23 | 最少找硬币问题(贪心策略-深搜实现) 23 | 棋盘分割 23 | 汉诺塔 23 | STL 中的 PRIORITY_QUEUE 24 | 堆栈 24 | 区间最大频率 24 | 取第 K 个元素 25 | 归并排序求逆序数 25 | 逆序数推排列数 25 | 二分查找 25 | 二分查找(大于等于 V 的第一个值) 25 | 所有数位相加 25 Number 数论 26 1 |递推求欧拉函数 PHI(I) 26 |单独求欧拉函数 PHI(X) 26 | GCD 最大公约数 26 | 快速 GCD 26 | 扩展 GCD 26 | 模线性方程 A * X = B (% N) 26 | 模线性方程组 26 | 筛素数 [1..N] 26 | 高效求小范围素数 [1..N] 26 | 随机素数测试(伪素数原理) 26 | 组合数学相关 26 | POLYA 计数 27 | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 | 线性方程组 A[][]X[]=B[] 28 | 追赶法解周期性方程 28 | 阶乘最后非零位,复杂度 O(NLOGN) 29 递归方法求解排列组合问题 30 | 类循环排列 30 | 全排列 30 | 不重复排列 30 | 全组合 31 | 不重复组合 31 | 应用 31 模式串匹配问题总结 32 | 字符串 HASH 32 | KMP 匹配算法 O(M+N) 32 | KARP-RABIN 字符串匹配 32 | 基于 KARP-RABIN 的字符块匹配 32 | 函数名: STRSTR 32 | BM 算法的改进的算法 SUNDAY ALGORITHM 32 | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面最近点对 O(N * LOGN) 34 | LIUCTIC 的计算几何库 35 | 求平面上两点之间的距离 35 | (P1-P0)*(P2-P0)的叉积 35 | 确定两条线段是否相交 35 | 判断点 P 是否在线段 L 上 35 | 判断两个点是否相等 35 | 线段相交判断函数 35 | 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | 射线与圆的第一个交点 36 | 求点 P1 关于直线 LN 的对称点 P2 36 | 两直线夹角(弧度) 36 ACM/ICPC 竞赛之 STL 37 ACM/ICPC 竞赛之 STL 简介 37 ACM/ICPC 竞赛之 STL--PAIR 37 ACM/ICPC 竞赛之 STL--VECTOR 37 ACM/ICPC 竞赛之 STL--ITERATOR 简介 38 ACM/ICPC 竞赛之 STL--STRING 38 ACM/ICPC 竞赛之 STL--STACK/QUEUE 38 ACM/ICPC 竞赛之 STL--MAP 40 ACM/ICPC 竞赛之 STL--ALGORITHM 40 STL IN ACM 41 头文件 42 线段树 43 求矩形并的面积(线段树+离散化+扫描线) 43 求矩形并的周长(线段树+离散化+扫描线) 44

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值