点击查看Evernote原文

#@author:       gr
#@date: 2014-09-17
#@email: forgerui@gmail.com

Chapter5 算法

Topic 30: 确保目标区间足够大

  如果所使用的算法需要指定一个目标区间,那么必须确保目标区间足够大,或者保证它会随着算法的运行而增大。可以使用back_inserterfront_inerter或者inserter返回的迭代器。

transform(values.begin(), values.end(), back_inserter(results), transmogrify);

Topic 31: 了解各种与排序有关的选择

  根据不同的需求选择不同的排序函数。稳定排序一般比不稳定排序开销更大。

  

  vector,string,deque或者数组执行一次完全排序,可以使用sortstable_sort。如果对前n个元素进行排序,可以使用partial_sort。如果只需找到前n个元素,而不需要对这n个元素进行排序,则使用nth_element

  

  如果将一个标准序列容器中的元素按照是否满足某个特定的条件区分开来,那么partitionstable_partition可能正是你所需要的。

  

  如果数据在一个list中,仍然可以使用partitionstable_partition算法,其它的方法对于list不适应。但可以使用list::sort取代sortstable_sort算法。如果需要partial_sortnth_element的效果,可以通过间接的方法实现。

  

Topic 32: 如果确实需要删除元素,则在remove之后调用erase

  删除容器中一些元素,remove是将相关的元素移到容器的最后,将.end()前移,并没有真正删除元素。需要再次调用erase删除元素。

  

  listremove函数实际上已经默认调用了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, mergeincludes, set_intersection, set_union, set_difference

排序算法一般使用等价来进行排序,uniqueunique_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进行区间统计

  accumulatefor_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的更多相关文章

  1. 《Effective STL》学习笔记

    http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...

  2. ###《Effective STL》--Chapter3

    点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...

  3. ###《Effective STL》--Chapter6

    点击查看Evernote原文. #@author: gr #@date: 2014-09-27 #@email: forgerui@gmail.com Chapter6 函数子.函数子类.函数及其他 ...

  4. ###《Effective STL》--Chapter7

    点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...

  5. ###《Effective STL》--Chapter1

    点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...

  6. ###《Effective STL》--Chapter2

    点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...

  7. ###《Effective STL》--Chapter4

    点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...

  8. 容器使用的12条军规——《Effective+STL中文版》试读

    容器使用的12条军规——<Effective+STL中文版>试读     还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...

  9. 《Effective STL中文版》前言

    <Effective STL中文版>前言     我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...

随机推荐

  1. hdoj 1405 The Last Practice

    The Last Practice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. FreeModbus Slave For AVR源代码 精简版2 【worldsing 笔记】

    FreeModbus 源码:点击下载 线圈BUG解决(后来发现不一定是BUG) 1.eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * ...

  3. (二)Bootstrap CSS 概览

    在这一章中,我们将讲解 Bootstrap 底层结构的关键部分,包括我们让 web 开发变得更好.更快.更强壮的最佳实践. HTML 5 文档类型(Doctype) Bootstrap 使用了一些 H ...

  4. 【不积跬步,无以致千里】Linux下启动Oracle服务和监听程序

    oracle数据库是重量级的,其管理非常复杂,将其在linux平台上的启动和关闭步骤整理一下. 安装完毕oracle以后,需要创建oracle系统用户,并在/home/oracle下面的.bash_p ...

  5. jquery ajax 报交请求返回 HTTP 400 错误

    提交请求的AJAX代码如下: 点击(此处)折叠或打开 $.ajax({ url: "${ctx}/selfhelp/userAttributeAnalysis/userAttributeLi ...

  6. [RxJS] Subject basic

    A Subject is a type that implements both Observer and Observable types. As an Observer, it can subsc ...

  7. Android仿腾讯应用宝 应用市场,下载界面, 有了进展button

    近期应用市场做,需要使用.下载与进度显示button,因此,要寻找其他大神做,直接用于改善.和很多无用的切出.在改进共享后. 再一次改变.当下载进度时,有进步.进度显示自己主动运行文本.并设置背景为灰 ...

  8. highcharts js报表工具(报表插件)

    highcharts报表工具(报表插件.图表工具) highcharts效果在线演示(可查看源代码):  http://www.hcharts.cn/demo/index.php?p=56 Highc ...

  9. jQuery执行请求demo

    Ajax教程地址 4.3.2 执行GET请求 使用jQuery来执行GET请求有多种可选的方法.最简单的方法是使用$.get(),其参数是一个URL和一个回调函数:该回调函数有两个参数:一个是从服务器 ...

  10. 实例源码--ZXing识别条形码和二维码识别源码

      下载源码 技术要点: 1.ZXing库的 使用 2.识别条形码和二 维码 3.自定义视图 4.源码带有非常详 细的中文注释 ...... 详细介绍: 1.ZXing库 ZXing是个很经典的条码/ ...