###《Effective STL》--Chapter5
点击查看Evernote原文。
#@author: gr
#@date: 2014-09-17
#@email: forgerui@gmail.com
Chapter5 算法
Topic 30: 确保目标区间足够大
如果所使用的算法需要指定一个目标区间,那么必须确保目标区间足够大,或者保证它会随着算法的运行而增大。可以使用back_inserter,front_inerter或者inserter返回的迭代器。
transform(values.begin(), values.end(), back_inserter(results), transmogrify);
Topic 31: 了解各种与排序有关的选择
根据不同的需求选择不同的排序函数。稳定排序一般比不稳定排序开销更大。
vector,string,deque或者数组执行一次完全排序,可以使用sort和stable_sort。如果对前n个元素进行排序,可以使用partial_sort。如果只需找到前n个元素,而不需要对这n个元素进行排序,则使用nth_element。
如果将一个标准序列容器中的元素按照是否满足某个特定的条件区分开来,那么partition和stable_partition可能正是你所需要的。
如果数据在一个list中,仍然可以使用partition和stable_partition算法,其它的方法对于list不适应。但可以使用list::sort取代sort和stable_sort算法。如果需要partial_sort和nth_element的效果,可以通过间接的方法实现。
Topic 32: 如果确实需要删除元素,则在remove之后调用erase
删除容器中一些元素,remove是将相关的元素移到容器的最后,将.end()前移,并没有真正删除元素。需要再次调用erase删除元素。
list的remove函数实际上已经默认调用了erase了,所以不需要再次调用。
map没有提供remove函数,使用erase删除。
Topic 33: 对包含指针的容器使用remove函数时要特别小心
使用remove时,指针会指向其他地方,这样有些内存就会无法访问,而造成内存泄漏。
方法一是在使用erase-remove之前,将要删除的元素的指针删除并置为空,然后再用erase-remove清除容器中所有的空指针。
方法二是使用智能指针shared_ptr,让系统进行管理。
Topic 34: 了解哪些算法要求使用排序的区间作为参数
需要排序区间的STL算法:
binary_search, lower_bound, upper_bound, equal_range, merge, includes, set_intersection, set_union, set_difference。
排序算法一般使用等价来进行排序,unique和unique_copy使用相等来判断两个对象是否相同。
Topic 36: 理解copy_if算法的正确实现
STL中没有提供copy_if的实现,需要自己实现。它的调用形式应该是下面这样的:
//判断Widget是否有损坏
bool isDefective(const Widget& w);
//调用copy_if形式
copy_if(c.begin(), c.end(), ostream_iterator<Widget>(cerr, "\n"), isDefective);
//copy_if的实现
OutputIterator copy_if(InputIterator begin, InputIterator end, OutputIterator destBegin, Predicate p){
while(begin != end){
if (p(*begin))
*destBegin++ = *begin;
++begin;
}
return destBegin;
}
Topic 37: 使用accumulate或者for_each进行区间统计
accumulate和for_each都可以进行区间统计。可以传递一个函数对象,对每个元素都调用这个函数对象,实现区间统计。实际上从命令上也可以看出,accumulate更偏重于区间统计,而for_each是对每区间的每一个元素做一个操作,当然也可以用来统计信息。
此外,accumulate可以直接返回统计结果,而for_each返回的是一个对象,需要从这个对象中提取统计信息,即在函数中加入一个成员函数,以获得想要的统计信息。
// 容器迭代器调用
accumulate(v.begin(), v.end(), 0.0);
accumulate(istream_iterator<int>(cin), istream_iterator<int>(), 0.0);
// 调用函数
accumulate(ss.begin(), ss.end(), 0, stringLengthSum);
// PointAveraget是一个函数子类,包含operator=(const Point&)和result()成员函数
for_each(lp.begin(), lp.end(), PointAverage()).result();
###《Effective STL》--Chapter5的更多相关文章
- 《Effective STL》学习笔记
http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...
- ###《Effective STL》--Chapter3
点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...
- ###《Effective STL》--Chapter6
点击查看Evernote原文. #@author: gr #@date: 2014-09-27 #@email: forgerui@gmail.com Chapter6 函数子.函数子类.函数及其他 ...
- ###《Effective STL》--Chapter7
点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...
- ###《Effective STL》--Chapter1
点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...
- ###《Effective STL》--Chapter2
点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...
- ###《Effective STL》--Chapter4
点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...
- 容器使用的12条军规——《Effective+STL中文版》试读
容器使用的12条军规——<Effective+STL中文版>试读 还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...
- 《Effective STL中文版》前言
<Effective STL中文版>前言 我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...
随机推荐
- spring jdbcTemplate源码剖析
本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...
- powershell.exe直接运行命令
powershell.exe -Command "& { ('time={0},user={1}' -f (get-date),(whoami)) | Out-File " ...
- git reset and git checkout
git reset --hard <commit>: 1.替换引用的指向.引用指向新的提交ID; 2.替换暂存区.替换后,暂存区的内容和引用指向的文件夹树一致; 3.替换工作区.替换后,工 ...
- 最全面的Android Intent机制讲解
对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样.在 Intent 的使用中你看不到直接的函数调用,相对函 ...
- Nginx加多个tomcat实现负载均衡,动静分离
一:Nginx+Tomcat的动静分离 所谓动静分离就是通过nginx(或apache等)来处理用户端请求的图片.html等静态的文件,tomcat(或weblogic)处理jsp.do等动态文件,从 ...
- JavaScript学习总结-技巧、有用函数、简洁方法、编程细节
整理JavaScript方面的一些技巧.比較有用的函数,常见功能实现方法,仅作參考 变量转换 //edit http://www.lai18.com var myVar = "3.14159 ...
- jquery插件开发(checkbox全选的简单实例)
html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- C_数据结构_链表的链式实现
传统的链表不能实现数据和链表的分离,一旦数据改变则链表就不能用了,就要重新开发. 如上说示:外层是Teacher,里面小的是node. #ifndef _MYLINKLIST_H_ #define _ ...
- Linux下各种常见环境变量的配置
Linux系统下各种环境变量都通过修改/etc/profile文件来实现.由于是系统文件,修改此文件需要root权限.因此实现以下功能都需要用户拥有root权限. 另:不要轻易修改profile文 ...
- 导入MyEclipse项目乱码
1.右键项目属性→text file encoding →修改为UTF-8,即可自动变成正常的.