STL学习笔记(五) 算法
条款30:确保目标区间足够大
条款31:了解各种与排序有关的选择
//使用unaryPred划分输入序列,使得unaryPred为真的元素放在序列开头
partition(beg, end, unaryPred);
//对[beg, mid)个元素进行排序,排序后[beg, end)范围元素有序,且为全排序之后的最终位置
partial_sort(beg, mid, end, comp);
//排序后score前3个元素有序且为整个序列的前3名
eg: partial_sort(score.begin(), score.begin() + , score.end());
nth_element(beg, nth, end, comp); //实参nth必须是一个迭代器,定位输入序列中的一个元素
//执行完之后,位置nth上元素为全排序之后应该放置的元素,且nth之前的元素(不一定有序)都 <= nth所表示值,nth之后的元素(不一定有序)都 >= nth所表示值
nth_element(score.begin(), score.begin() + score.size() / , score.end());
partial_sort、nth_element、sort都是非稳定的排序算法,都要求随机访问迭代器(所以只能应用于 vector、string、deque、array)
总结:
()如果需要对vector、string、deque、array所有元素执行完全排序,可以使用sort或者stable_sort
()如果只需要对vector、string、deque、array最前面的n个元素进行排序,可以使用 partial_sort
()如果vector、string、deque、array 需要找到排序后第n个位置上的元素,或者只需要找到最前面的n个元素(这些元素不是有序),可以使用nth_element
()如果是list容器,可以使用list::sort(成员函数,稳定排序),但是没有partial_sort和nth_element
条款32:如果确实需要删除元素,则需要在 remove 这一类算法之后调用 erase
remove 移动了区间中的元素,结果是:"不用被删除"的元素移到了区间的前面(保持原有的相对顺序),返回一个迭代器指向最后一个"不用被删除"的下一个元素
如果真想删除元素,那就必须在remove之后使用erase
vec.erase(remove(vec.begin(), vec.end(), 2012), vec.end());
remove_if 和 unique 的用法与remove完全相同,都必须结合 erase 完成真正的操作
条款33:对包含指针的容器使用 remove 这一类算法时要特别小心
对包含指针的容器使用 remove-erase 会造成内存泄露,可使用 shared_ptr 代替
条款34: 了解哪些算法要求使用排序的区间作为参数
以下算法必须使用排序区间作为参数:
O(log n)的二分搜索相关算法: binary_search, lower_bound, upper_bound, equal_range
O(n)的集合操作: set_union, set_intersection, set_difference, set_symmetric_difference
条款35:通过 mismatch 实现简单的忽略大小写的字符串比较
条款36:了解 copy_if的实现
条款37:使用 accumulate或者for_each进行区间统计
accumulate使用第三个参数的类型推导出最后计算结果的类型,所以以下两个计算结果完全不同:
double sum = accumulate(vec.begin(), vec.end(), 0.0); //计算结果类型为double
double sum = accumulate(vec.begin(), vec.end(), );//计算结果为int变量,最后转为double型
计算连乘积:
vector<double> vec;
double product = accumulate(vec.begin(), vec.end(), 1.0, multiplies<double>()); //multiplies为仿函数; 注意连乘初始值为1.0
STL学习笔记(五) 算法的更多相关文章
- STL学习笔记--排序算法
排序算法 C++ STL 的排序算法(Sorting algorithms)是一组将无序序列排列成有序序列的模板函数或与排序相关的模板函数,提供了排序.折半搜索.归并.集合操作.堆操作.最值求解.字典 ...
- STL学习笔记(算法概述)
算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
随机推荐
- Linux配置临时IP地址
# ifconfig 查看网卡信息,如下图所示: # ifconfig eth0 192.168.0.107 eth0表示第一块网卡,Linux中所有的设配都是文件,所以eth0是第一块网卡的文件名, ...
- UVA Live 3713 Astronauts (2-SAT)
用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案. #include<bits/stdc++.h> using namespace std; ; #de ...
- JS常用操作节点的方法
js常见的创建dom节点的方法有 createElement() 创建一个元素节点 => 接收参数为string类型的nodename createTextNode() 创建一个文本节点 =&g ...
- HITICS || 2018大作业 程序人生 Hello's P2P
摘 要 本文通过分析一个hello.c的完整的生命周期,从它开始被编译,到被汇编.链接.在进程中运行,讲解了Linux计算机系统执行一个程序的完整过程. 关键词:操作系统,进程,程序的生命周期 目 ...
- 【转】Java重构-策略模式、状态模式、卫语句
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
- javase(4)_数组
一.数组概述 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属于引用类型,数组也可以看成对象,数组中的每个元素相当于该对象的成员变量. 数组中的元素可以是任意类型,包括基本类型和 ...
- jQuery实现滚动条下拉时无限加载
var lastId=0;//记录每一次加载时的最后一条记录id,跟您的排序方式有关. var isloading = false; $(window).bind("scroll" ...
- 【php】类型转换
$a = 9; print_r((array) $a) ; 输出: [0=>9] print_r((array) null); 输出: []
- Python-小游戏题目
猜年龄游戏 n = 0 rayn_age = 19 a = {0:'666',1:'777',2:'888'} while n <3: age = input('请输入你的年龄:') age = ...
- Linux 权限设置和 SUID, SGID 以及粘滞位sticky bit
suid是指在执行suid程序的过程中,去访问其他文件时拥有suid程序属主的权限,而不是指对suid程序本身拥有suid程序属主的权限! 一. Linux 文件权限的表示方法 文件权限用 12 个二 ...