03--STL算法(常用算法)
一:常用的查找算法
(一)adjacent_find():邻接查找
在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end
vector<int> v1;v1.push_back(2);v1.push_back(1);v1.push_back(3);v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(9);vector<int>::iterator iter = adjacent_find(v1.begin(), v1.end()); //只查找第一个cout << *iter << endl;
(二)binary_search():二分查找
在有序序列中查找value,找到则返回true。注意:在无序序列中,不可使用(虽然不会报错,但是无法正常工作)
int main() {vector<int> v1,v2;v1.push_back(3);v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;sort(v1.begin(), v1.end());bool flag = binary_search(v1.begin(), v1.end(),8);if (flag)cout << "find 8" << endl;for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;system("pause");return 0; }
注意:对于vector,deque等容器需要我们先解析排序再来查找。所以set,map更加适合binary_search,自动排序
(三)count和count_if:
1)count(first,last,value):first是容器的首迭代器,last是容器的末迭代器,value是询问的元素,整个函数返回int型。count函数的功能是:统计容器中等于value元素的个数。2)count_if(first,last,comp) (在comp为true的情况下计数) 或者 count_if(first,last,value,comp) (这个是在comp为true的情况下统计容器中等于value的元素):first为首迭代器,last为末迭代器,value为要查询的元素,comp为比较bool函数,为true则计数,函数返回型是int。注:此两个函数复杂度是线性的,适用于小规模运算。count_if更加灵活
#include <iostream> #include <vector> #include <algorithm> #include <functional> //由于要使用到预定义函数对象,所以引入using namespace std;template<typename T> void ShowEle(const T& t) //用于打印容器数据 {cout << t << " "; }int main() {vector<int> v1, v2, v3;for (int i = 0; i < 10;i++)v1.push_back(rand() % 30); //v1数据插入//打印数据for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;int num = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 2));cout << num << endl;system("pause");return 0; }
(四)find和find_if:同上
1)find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的迭代器。 2)find_if: 使用输入的函数代替等于操作符执行find。返回被找到的元素的迭代器。上面两个都是找到符合条件的首个元素的迭代指针
vector<int> v1;v1.push_back(3);v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;vector<int>::iterator iter = find(v1.begin(), v1.end(), 8);cout << *iter << endl;
vector<int>::iterator iter = find_if(v1.begin(), v1.end(), bind2nd(greater<int>(),6)); cout << *iter << endl;
二:常用的排序算法
(一)merge()
merge: 合并两个有序序列,存放到另一个序列。《必须是有序序列》
vector<int> v1,v2,v3;v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);v1.push_back(3);v2.push_back(7);v2.push_back(2);v2.push_back(13); sort(v1.begin(), v1.end()); //必须进行排序,否则报错 sort(v2.begin(), v2.end()); v3.resize(10); //多余空间会默认存放0 merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());for_each(v3.begin(), v3.end(), ShowEle<int>);
(二)sort():使用如上
sort: 以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。
(三)random_shuffle()
对指定范围内的元素随机调整次序。
vector<int> v1,v2,v3;v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);v1.push_back(3);v2.push_back(7);v2.push_back(2);v2.push_back(13);sort(v1.begin(), v1.end()); //必须进行排序,否则报错 sort(v2.begin(), v2.end());v3.resize(10); //多余空间会默认存放0 merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());for_each(v3.begin(), v3.end(), ShowEle<int>);cout << endl;//对v3进行随机调序 random_shuffle(v3.begin(), v3.end());for_each(v3.begin(), v3.end(), ShowEle<int>);
(四)reverse()
将容器中数据翻转
for_each(v3.begin(), v3.end(), ShowEle<int>);cout << endl; reverse(v3.begin(), v3.end());for_each(v3.begin(), v3.end(), ShowEle<int>);cout << endl;
三:常用的拷贝和替换算法
(一)copy()
将容器中数据拷贝到下一个容器中
vector<int> v1,v2,v3;v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);v1.push_back(3);v2.resize(5);copy(v1.begin(), v1.end(), v2.begin());for_each(v2.begin(), v2.end(), ShowEle<int>);
(二)replace()
replace(beg,end,oldValue,newValue): 将指定范围内的所有等于oldValue的元素替换成newValue。
replace(v2.begin(), v2.end(), 3, 13);for_each(v2.begin(), v2.end(), ShowEle<int>);cout << endl;
(三)replace_if()
将指定范围内所有操作结果为true的元素用新值替换。
replace_if(v2.begin(), v2.end(), bind2nd(greater<int>(), 7), 2); //将所有大于7的数变为2for_each(v2.begin(), v2.end(), ShowEle<int>);cout << endl;
(四)swap()
交换两个容器的元素
for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;for_each(v2.begin(), v2.end(), ShowEle<int>);cout << endl;swap(v1, v2);cout << "swap v1 v2" << endl;for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;for_each(v2.begin(), v2.end(), ShowEle<int>);cout << endl;
四:常用的算术和生成算法
算术算法在#include<numeric>
(一)accumulate()
对指定范围内的元素求和,然后结果再加上一个由val指定的初始值
int ret = accumulate(v1.begin(), v1.end(), 0);cout << ret << endl;
(二)fill()
将输入值赋给标志范围内的所有元素
v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);v1.push_back(3);v1.resize(10); //后面扩充的全部赋值为0 for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;fill(v1.begin() + 5, v1.end(), 6);for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;
五:常用的集合算法
(总)set_union(),set_intersection(),set_difference():要求序列有序
set_union: 构造一个有序序列,包含两个有序序列的并集。 set_intersection: 构造一个有序序列,包含两个有序序列的交集。 set_difference: 构造一个有序序列,该序列保留第一个有序序列中存在而第二个有序序列中不存在的元素,为差集。
vector<int> v1,v2,v3;v1.push_back(3);v1.push_back(6);v1.push_back(9);v1.push_back(8);v1.push_back(3);v2.push_back(3);v2.push_back(10);v2.push_back(9); sort(v1.begin(), v1.end());sort(v2.begin(), v2.end());v3.resize(10);
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());for_each(v3.begin(), v3.end(), ShowEle<int>);cout << endl;
set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());for_each(v3.begin(), v3.end(), ShowEle<int>);cout << endl;
set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());for_each(v3.begin(), v3.end(), ShowEle<int>);cout << endl;
六:常用的遍历算法
(一)for_each()
用指定函数依次对指定范围内所有元素进行迭代访问。
(二)transform()
可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。
注:可以修改自己序列,只需要将第三个参数写为自己即可
(三)算法使用案例
template<typename T> void ShowEle(const T& t) //用于打印容器数据 {cout << t << " "; }//自定义二元函数对象---数据相加 template<typename T> class MySumAdd :public binary_function<T, T, int> { public:int operator()(const T& t1, const T& t2) const{return t1 + t2;} };int main() {vector<int> v1;for (int i = 0; i < 10;i++)v1.push_back(rand() % 30); //v1数据插入 for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;//将v1中所有数据加2transform(v1.begin(), v1.end(), v1.begin(), bind2nd(MySumAdd<int>(), 2));for_each(v1.begin(), v1.end(), ShowEle<int>);cout << endl;system("pause");return 0; }
转载于:https://www.cnblogs.com/ssyfj/p/10795388.html
03--STL算法(常用算法)相关推荐
- C++ STL【常用算法】详解
大家好,欢迎来到STL[常用算法]详解模块,本文将对STL中常见但又高频的算法进行一个详细又简单的入门级教学
- c++中STL的常用算法---2(遍历算法,查找算法)
算法概述 算法主要由头文件组成 是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等 体积很小,只包括在几个序列容器上进行的简单运算的模板函数 定 ...
- c++中STL的常用算法--1(函数对象,谓词,内建函数对象)
函数对象 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得 ...
- 经典常用算法/常用算法思维---附伪代码以及实现
本篇文章旨在分享一些常用算法的伪代码以及部分算法的具体实现,后面也会更新我在刷算法题中学到的或者从别的地方看到的经典算法思维 本博客并不提供算法说明,算法证明,算法分析,算法测试等内容,只提供算法的伪 ...
- c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)
排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include<iostream>using namespace s ...
- php常用设计模式和算法,常用算法、问答、设计模式
1.Cookie 禁用了,Session 还能用吗? 对应的服务器 Session,Session ID 是通过 Cookie 来传递的,禁用 Cookie 相当于失去了 Session ID,就得不 ...
- 熬夜爆肝!C++核心STL常用算法汇总整理【2W字干货预警 建议收藏】
前言 1 STL- 常用算法 1.1 常用遍历算法 1.1.1 for_each 1.1.2 transform 1.2 常用查找算法 1.2.1 find 1.2.2 find_if 1.2.3 a ...
- 【机器学习算法专题(蓄力计划)】一、机器学习简史和常用算法的梳理
文章目录 机器学习简史 二十世纪五十年代:推理期 二十世纪七十年代中期:知识期 二十世纪八十年代:从样例中学习 符号主义学习 连接主义学习 二十世纪九十年代中期:统计学习 二十一世纪:深度学习 机器学 ...
- [C++ STL] 常用算法总结
1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...
- C++超详细STL常用算法总结
STL 常用算法: 写在开篇:整理了一些stl中很常用的算法,涉及到比较,交换,查找,遍历,复制,修改等.值得大嘎收藏呀!! 目录: STL 常用算法: 1. 常用遍历算法: 1.1 for_each ...
最新文章
- 给jar包进行数字签名(2014-06-28记)
- 地图API引发的设想
- 股权分配中的三种定时炸弹
- ORM框架通过映射(反射)获取数据库的数据
- 修改已经创建的docker容器的端口映射
- Data Base学习记录:关系模型
- 老电脑装linux系统能变流畅吗,老电脑非常卡如何变流畅?高手教你把电脑变流畅的五种方法...
- 函数式编程Haskell初探
- MongoDB 分片集群故障RECOVERING 处理纪实
- 最短路径之佛洛伊德算法
- unity的切屏显示顺序
- 硬货专栏 |WebRTC SDP 详解和剖析
- 在Windows和macOS上更新Node.js到最新版本
- 腾讯面试--测试工程师社会招聘面试经历
- mixly 添加micropython_Mixly For Mac
- 个性化智能推荐(协同过滤算法)技术研究
- Java代码判断是否是回文数
- Transformers预测未来:关注下一帧和时间序列预测
- 十四个助你成功的心理定律
- 设计模式之-适配器模式