条款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学习笔记(五) 算法的更多相关文章

  1. STL学习笔记--排序算法

    排序算法 C++ STL 的排序算法(Sorting algorithms)是一组将无序序列排列成有序序列的模板函数或与排序相关的模板函数,提供了排序.折半搜索.归并.集合操作.堆操作.最值求解.字典 ...

  2. STL学习笔记(算法概述)

    算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...

  3. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  4. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. 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 ...

  7. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  8. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  9. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

随机推荐

  1. 如何让Spring MVC显示自定义的404 Not Found页面

    不知道大家对千篇一律的404 Not Found的错误页面是否感到腻歪了?其实通过很简单的配置就能够让Spring MVC显示您自定义的404 Not Found错误页面. 在WEB-INF的web. ...

  2. rhythmbox插件开发笔记2:背景知识学习 D-Bus&VFS&Gio& Python GTK+ 3

    这次主要简单介绍下相关的背景知识 D-Bus&VFS&Gio& Python GTK+ 3  D-Bus D-Bus是开源的进程通信(IPC)系统,它允许多个进程进行实时通信. ...

  3. 解决activeandroid no such table

    场景:activeandroid拷贝数据库 (1)复制sql数据库到项目的assets目录,例如/myapp/src/main/assets/prepop.db (2)确保manifest的AA_DB ...

  4. Make 学习笔记(1)

    Make 学习笔记(1) 参考: GNU make 学习总结(1) 基础 make是帮助程序员使编译器明白如何编译工程的一种工具; 核心是规则. 规则一般由三部分组成: 目标(target) 必要条件 ...

  5. UVA - 12264 Risk (二分,网络流)

    题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了... 最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行. 这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的 ...

  6. 数据库_8_SQL基本操作——数据操作

    SQL基本操作——数据操作 一.新增数据(两种方案) 方案1: 给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致,凡是非数值数据,都需要使用引号(建议是 ...

  7. 两个input标签之间间隙问题的解决

    <input type="text"> <input type="button" value="搜索"> 代码显示效 ...

  8. Hibernate 中批量处理数据

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作     数据库层面 ...

  9. iOS HmacSHA1加密 和 MD5 Base64加密 --iOS开发系列---项目中成长的知识五

    项目中开发中需要对一些数据进行加密后和服务器验证是否是我们客户端发出的请求! 方案是服务器定的,使用HmacSHA1加密和MD5 Base64加密 加密过程比较复杂 1.获取格林威治时间 2.用bas ...

  10. c++ 输入10个数,显示它的平均分

    #include <iostream> using namespace std; void inputScores(double golfScores[], int size); void ...