STL 笔记(五) 算法 algorithm
在 STL 中,算法是一系列的函数模版。STL 提供了大概 70 个算法,由头文件 <algorithm>、<numeric>、<functional>组成。
- 头文件 <algorithm> 是最大的一个,里面经常使用到的功能有:查找、排序、改动、移除、交换、合并等;
- 头文件 <numeric> 较小,主要包含相关数学运算的函数模版,以及加法和乘法在序列上的一些操作;
- 头文件 <functional> 中则定义了一些类模版,来声明函数对象;
算法的分类:
- 算法按事实上现的功能可分为 8 类:查找、排序、数值计算、比較、集合、容器管理、统计、 堆操作。
- 算法按对容器的影响可分为 4 类:非修正、修正、排序、数值计算;
非修正算法
非修正即不正确容器中元素做改动。是仅仅读操作。如:find()、count()、equal()、for_each()、search()等。详细例如以下:
adjacent_find #查找同样的相邻元素 返回第一个元素的迭代器
find #查找
find_first_of
find_end
find_last_of
count #统计同样元素的个数
count_if
mismatch #返回 pair<第一个序列的迭代器,第二个序列的迭代器> 表明第一处不相符合的位置
equal #比較容器中的元素是否同样
for_each #经常使用,遍历序列并对序列中每一个元素採用仿函数中定义的操作
search #返回迭代器,第一次出现序列二或者某元素的位置
search_n #前n次连续出现某元素或者符合条件的第一个位置
修正算法
修正算法即对容器中元素做改动,须要写操作。
如:copy()、remove()、reverse()、swap()、unique()等。详细例如以下:
copy #复制元素到目的容器
copy_backward #从后往前复制
fill #用某元素填充容器
fill_n
generate #把仿函数产生的结果依次拷贝到容器中
generate_n
partition #以仿函数为标准,把容器分成前后两部分,前半部分是能使仿函数返回真的元素,后半返回假
stable_partition
random_shuffle #对容器中的元素进行随机排列
remove #删除某一范围内的元素,注意:移除的元素被放到容器末尾,还是能够用迭代器遍历到,函数返回移除后容器的末尾
remove_if
erase #擦除区间内全部的元素
replace #在规定区间内把某值换成新值
replace_if
replace_copy #把区间内元素拷贝到目的地而且把当中某些元素替换成新值
replace_copy_if
rotate #把 middle-end 的元素放到 first 的位置上
rotate_copy
swap #元素的交换
swap_ranges
transform #把元素依照仿函数中内容转换
unique #保证相邻元素间没有同样的,能够加仿函数做为推断根据,返回最后一个位置的迭代器
unique_copy
排序算法
排序须要移动元素,所以须要用到随机訪问迭代器 RandomAccessIterator,而且指定 [begin,end) 这个前闭后开区间,且可自定义比較函数做參数传入。
常见容器的排序
- vector 和 deque。还有数组,支持随机存取。能够用 algorithm 中的排序。
- list 容器是双向链表,不支持随机訪问迭代器,内置了一种稳定排序方法,用的是自底向上的归并排序;
- map 和 set 底层是红黑树。本身就是有序存储;
经常使用的排序函数
sort #对给定区间全部元素进行排序,用的是快排
stable_sort #稳定排序,保证值相等的元素排序后相对位置不变。用归并排序实现
partial_sort #部分排序,保证前n个值有序而且后面的值不在前n个值的范围内,但后面的值不保证有序,堆排序实现
partial_sort_copy #对给定区间复制并排序
nth_element #把第n个元素放到第n个位置上去。比它大的都在后。比它小的都在前,但各自都不保证有序
is_sorted #推断一个区间是否已经排好序
partition #使得符合某个条件的元素放在前面
stable_partition #相对稳定的使得符合某个条件的元素放在前面
经常使用的比較函数
less #小于(缺省比較函数)
greater #大于
equal_to #等于
less_equal #小于等于
greater_equal #大于等于
自己定义比較大小
使用时不能直接写入仿函数的名字,而是要写其重载的() 函数。如 less<int>()。以下是 stl 中的 less 的部分源代码:
template <class _Tp>
struct less : public binary_function<_Tp,_Tp,bool>
{
bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
};
对于基本数据类型和 string 能够使用 stl 中现成的函数模版,对于自定义的类。能够通过自己写比較函数或重载 < 操作符来实现。当中,重载 < 运算符相当于间接的用到了内置的 less 。
小样例
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; class Test {
public:
Test(int a):a(a){};
int a;
bool operator <(const Test &k) const {
return a < k.a;
}
}; int main(){
vector<Test> a;
a.push_back(Test(2));
a.push_back(Test(3));
a.push_back(Test(1));
vector<Test>::iterator iter;
sort(a.begin(), a.end());
for(iter = a.begin(); iter != a.end(); ++iter){
cout<< iter->a <<" ";
} // 输出排序后:1 2 3
}
数值计算
数值计算函数
数值计算算法主要针对容器中元素的计算,如 accumulate()、inner_product()、partial_sum()、adjacent_difference()和一些推广的数值算法。
详细:
accumulate #遍历求和,也能够用仿函数求其它数值
inner_product #内积。对应位置相乘再相加
partial_sum #部分元素之和,把结果放到后一容器中,后一容器的第n个元素师前一容器的前n个容器元素之和
adjacent_difference #相邻元素之差,把结果放到后一容器中
小样例
#include <iostream>
#include <functional>
#include <numeric>
#include <vector>
using namespace std;
int main() {
int a[3] = { 2, 2, 3 };
int re = accumulate(a, a + 3, 0);
cout << re << endl; // 7, 累加
vector<int> b;
b.push_back(2);
b.push_back(2);
b.push_back(3);
int re1 = accumulate(b.begin(), b.end(), 0, plus<int>());
cout << re1 << endl; // 7, 累加
int re2 = accumulate(b.begin(), b.end(), 1, multiplies<int>());
cout << re2; // 12, 累乘
}
有序容器、堆、集合
binary_search #二分法搜索,在有序容器中提高搜索速度
lower_bound #返回第一次出现该元素的位置
upper_bound #返回最后一次出现该元素的后一位置
equal_range #返回pair<lower_bound,upper_bound>
inplace_merge #将连贯有序序列合并
merge #合并两个容器
includes #推断某区间内全部的元素是否在还有一区间中 #堆操作
push_heap
pop_heap
sort_heap
make_heap #集合操作
set_intersection
set_difference
set_symmetric_difference #最值
min #最小
max #最大
min_element #最小位置的迭代器
max_element #最大位置的迭代器
lexicograplical_compare #范围内的字典序比較。前后序列的比較
next_permutation prev_permutation #上一个/下一个全排列
【原文地址:http://blog.csdn.net/thisinnocence/article/details/39941603】
STL 笔记(五) 算法 algorithm的更多相关文章
- STL学习笔记(五) 算法
条款30:确保目标区间足够大 条款31:了解各种与排序有关的选择 //使用unaryPred划分输入序列,使得unaryPred为真的元素放在序列开头 partition(beg, end, unar ...
- STL笔记(6)标准库:标准库中的排序算法
STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...
- 数据结构(DataStructure)与算法(Algorithm)、STL应用
catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...
- STL学习笔记--排序算法
排序算法 C++ STL 的排序算法(Sorting algorithms)是一组将无序序列排列成有序序列的模板函数或与排序相关的模板函数,提供了排序.折半搜索.归并.集合操作.堆操作.最值求解.字典 ...
- STL笔记(5)条款49:学习破解有关STL的编译器诊断信息
STL笔记(5)条款49:学习破解有关STL的编译器诊断信息 条款49:学习破解有关STL的编译器诊断信息 用一个特定的大小定义一个vector是完全合法的, vector<int> v( ...
- STL笔记(3) copy()之绝版应用
STL笔记(3) copy()之绝版应用 我选用了一个稍稍复杂一点的例子,它的大致功能是:从标准输入设备(一般是键盘)读入一些整型数据,然后对它们进行排序,最终将结果输出到标准输出设备(一般是显示器屏 ...
- STL中的算法
STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...
- STL笔记(4)关于erase,remove
STL笔记(4)关于erase,remove 你要erase的元素很容易识别.它们是从区间的“新逻辑终点”开始持续到区间真的终点的原来区间的元素.要除去那些元素,你要做的所有事情就是用那两个迭代器调用 ...
- 深度学习word2vec笔记之算法篇
深度学习word2vec笔记之算法篇 声明: 本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...
随机推荐
- Objective-C设计模式——中介者Mediator(对象去耦)
中介者模式 中介者模式很好的诠释了迪米特法则,任意两个不相关的对象之间如果需要关联,那么需要通过第三个类来进行.中介者就是把一组对象进行封装,屏蔽了类之间的交互细节,使不同的类直接不需要持有对方引用也 ...
- 重新学习Java——Java基本的程序设计结构(一)
最近在实验室看到各位学长忙于找工作的面试与笔试,深感自己的不足,决定重新好好学习一下<Java核心技术>这本书,曾经靠这本书走入Java的世界,但是也有很多的地方被我疏漏过去了,因此也是作 ...
- UVM基础之---------uvm factory机制register
factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...
- sp_Msforeachtable与sp_Msforeachdb详解
一.简要介绍: 系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程.从mssql6.5开始,存放在SQL Server的MASTER数据 ...
- 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期
三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...
- [JSOI2012]玄武密码 题解(AC自动机)
显然是AC自动机对吧 插入单词之后把文章在自动机上跑一遍,到达过的节点打上花火标记 之后检查一下每个单词有几个标记即可 可以把题目中的4个字母映射成abcd方便遍历 一定要记得把文章也映射啊! #in ...
- VC++代码转换为QT代码问题总结
一边开发一边总结...... QQ937113547
- Apache添加到windows服务和移除Apache的windows服务
Apache添加到windows服务和移除Apache的windows服务 Apache免安装版将其添加到Windows服务中: 打开cmd控制台,在上面输入"你的Apache安装目录\bi ...
- C#服务端通过Socket推送数据到Android端App中
需求: 描述:实时在客户端上获取到哪些款需要补货. 要求: 后台需要使用c#,并且哪些需要补货的逻辑写在公司框架内,客户端采用PDA(即Android客户端 版本4.4) . 用户打开了补货通知页面时 ...
- xmpp聊天室(5)
聊天室 //初始化聊天室 XMPPJID *roomJID = [XMPPJID jidWithString:ROOM_JID]; xmppRoom = [[XMPPRoom alloc] initW ...