03--STL算法(常用算法)
一:常用的查找算法
(一)adjacent_find():邻接查找
- 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end
- vector<int> v1;
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- 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();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- for_each(v1.begin(), v1.end(), ShowEle<int>);
- cout << endl;
- sort(v1.begin(), v1.end());
- bool flag = binary_search(v1.begin(), v1.end(),);
- if (flag)
- cout << "find 8" << endl;
- for_each(v1.begin(), v1.end(), ShowEle<int>);
- cout << endl;
- system("pause");
- return ;
- }
- 注意:对于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 = ; i < ;i++)
- v1.push_back(rand() % ); //v1数据插入
- //打印数据
- for_each(v1.begin(), v1.end(), ShowEle<int>);
- cout << endl;
- int num = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), ));
- cout << num << endl;
- system("pause");
- return ;
- }
(四)find和find_if:同上
- )find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的迭代器。
- )find_if: 使用输入的函数代替等于操作符执行find。返回被找到的元素的迭代器。
上面两个都是找到符合条件的首个元素的迭代指针
- vector<int> v1;
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- 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();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- 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();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- sort(v1.begin(), v1.end()); //必须进行排序,否则报错
- sort(v2.begin(), v2.end());
- v3.resize(); //多余空间会默认存放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();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v2.resize();
- 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的数变为2
- for_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(), );
- cout << ret << endl;
(二)fill()
- 将输入值赋给标志范围内的所有元素
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- 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();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- 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 = ; i < ;i++)
- v1.push_back(rand() % ); //v1数据插入
- for_each(v1.begin(), v1.end(), ShowEle<int>);
- cout << endl;
- //将v1中所有数据加2
- transform(v1.begin(), v1.end(), v1.begin(), bind2nd(MySumAdd<int>(), 2));
- for_each(v1.begin(), v1.end(), ShowEle<int>);
- cout << endl;
- system("pause");
- return ;
- }
03--STL算法(常用算法)的更多相关文章
- STL标准库-算法-常用算法
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...
- C++ STL 之 常用算法
#include <iostream> #include <vector> #include <algorithm> using namespace std; // ...
- STL中常用算法
一.排序 sort sort(first_pointer,first_pointer+n,cmp) 默认为升序 若要使用降序,自行写cmp 函数 bool cmp(int a,int b){ retu ...
- STL——配接器、常用算法使用
学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...
- [C++ STL] 常用算法总结
1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...
- 28.STL常用算法
#include <algorithm> 算法 常用版本 描述 返回Type std::find() find(_InIt _Fisrt,_InIt _Last, _Ty& _Va ...
- C++ STL——常用算法
目录 一 常用查找算法 二 常用遍历算法 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 常用查找算法 /* find算法 查找元素 @param ...
- ACM常用算法及练习(2)
ACM常用算法及练习 知识类型 重要度 容易度 应掌握度 典型题 其他 数据结构(5) 链表 ★★☆ ★★★ ★★☆ 栈 stack ★★★ ★★★ ★★★ HLoj120 ...
- ACM常用算法及练习(1)
ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...
- 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)
相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...
随机推荐
- 运输层5——TCP报文段的首部格式
写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4--TCP可靠运输的工作原理 ...
- -bash: zip: command not found提示解决办法
-bash: zip: command not found是因为liunx服务器上没有安装zip命令,需要安装一下即可linux安装zip命令:apt-get install zip 或yum ins ...
- MySQL进阶15--TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读
#TCL事物控制语言 : /* Transaction control language : 事物控制语言 事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行; ...
- 为什么要设置HTTP timeout?
先看一个不设置timeout造成的线上事故. 一次线上事故 有一次生产上的一个服务出了点故障,一个原本每5分钟执行一次的定时任务突然不执行了.第一反应是任务执行报错,查看日志,却没有找到任何异常报错信 ...
- python学习之多线程多进程
python基础 进程&线程 进程是一组资源的集合,运行一个系统就是打开了一个进程,如果同时打开了两个记事本就是开启了两个进程,进程是一个笼统的概念,进程中由线程干活工作,由进程统一管理 一个 ...
- node 异步回调 —迭代记录
1.0 开始时node采用了基础的js回调形势 const fs = require('fs'); fs.readFile('./package.json',(err,data) => { i ...
- PHP 函数运行的内存
函数在运行期间占用的内存,在运行结束后会被回收.但是还有问题不明白,函数内部的echo在函数执行结束后还占用内存吗??? //PHP 函数执行完内存就会被收回 function test() { ec ...
- 003_创建simulink文件
001_创建simulink文件 1. 打开MATLAB,打开simulink 2. 打开空白模块 3. 保存,并打开模块的选择 4. 在模块里面选择后拖出模块后连线 或在搜索名称后拖出来 或在空白的 ...
- ElasticSearch数据导入By Postman
样例数据 为了更好的使用和理解ES,没有点样例数据还是不好模拟的.这里提供了一份官网上的数据,accounts.json.如果需要的话,也可以去这个网址玩玩,它可以帮助你自定义写随机的JSON数据. ...
- luogu 1712
按区间长度降序排序维护区间指针 [l, r],第 l ~ r 条线段 表示当前区间可以满足条件那么 r 后移一定不是更优的因此 l 前移,使得 r 后移过程中取最小值更新 answer #includ ...