[非书评] 内容简述

王很水
2018-07-06 18:13:31

容器

item1 根据需求选择容器

  • 随机插入 (O(1)) list O(n) 查找
  • 随机访问 只能是vector deque string
  • 事务性语义?异常安全?list

item2 容器无关的代码太难,不能面面俱到,容器都提供相同接口是很困难的,不过<algorithm>可以弥补一点

item3 使容器里的对象拷贝操作轻量而正确,要考虑copy ctor,operator=()实现,可能性能瓶颈在这里,也要考虑继承带来的切割问题

item4empty代替size()==0,底层实现上size()的实现可能是O(n)的比如list,由于splice设计问题(c++11已经优化了)

item5区间成员函数,不手写循环,能用assign insert就不用copy手写循环迭代器失效的问题,copy-inserter解决

item6小心括号解析的问题,可能解析成函数声明了。

item7-8 容器里放指针放指针可能有泄露风险,代码不干净,用智能指针托管,不能用auto_ptr

item9erase-remove惯用法,list.remove,map.erase , 迭代器for-erase迭代器失效递增放在循环内 (不要这样写,给自己和别人增加心智负担)

item10-11 分配器,自定义分配器,用同一个分配器

item12 stl 与线程安全 不是lock-fr

...
显示全文

容器

item1 根据需求选择容器

  • 随机插入 (O(1)) list O(n) 查找
  • 随机访问 只能是vector deque string
  • 事务性语义?异常安全?list

item2 容器无关的代码太难,不能面面俱到,容器都提供相同接口是很困难的,不过<algorithm>可以弥补一点

item3 使容器里的对象拷贝操作轻量而正确,要考虑copy ctor,operator=()实现,可能性能瓶颈在这里,也要考虑继承带来的切割问题

item4empty代替size()==0,底层实现上size()的实现可能是O(n)的比如list,由于splice设计问题(c++11已经优化了)

item5区间成员函数,不手写循环,能用assign insert就不用copy手写循环迭代器失效的问题,copy-inserter解决

item6小心括号解析的问题,可能解析成函数声明了。

item7-8 容器里放指针放指针可能有泄露风险,代码不干净,用智能指针托管,不能用auto_ptr

item9erase-remove惯用法,list.remove,map.erase , 迭代器for-erase迭代器失效递增放在循环内 (不要这样写,给自己和别人增加心智负担)

item10-11 分配器,自定义分配器,用同一个分配器

item12 stl 与线程安全 不是lock-free数据结构

vector和string

item13尽量用vectorstring代替动态分配的数组newdelete[] 心智负担大 要小心string,COW一般都是用引用计数实现的,多线程下可能有问题

item14使用reserve,估个大概数量,这条是涉及到vector内部的实现原理,push_back扩展重新分配的问题,reserve可以避免

item15小心string实现的多样性 (潜台词,理解string实现,COW(引用计数),SSO等等)

item16老代码API如何兼容vector和string

item17().swap swap惯用法不过c++11有clear了

item18fuck vector<bool> 使用deque<bool> bitset<N>

关联容器

item19了解关联容器中的相等与等价,不是operator==()这么简单,还有自定义的compare参数还有引入的插入问题

item20指针关联容器,要制定compare

item21 关联容器中的严格弱序

item22避免改Keyconst_cast这种阴险招式也不合适,这涉及到关联容器的内部实现,红黑树item23考虑用有序vector代替关联容器 (结合模板算法也能达到对数查找复杂度)(c++11用unordered_map)

item24 map::operator[]与map::insert insert高效,operator[]不过是语法糖,还有冗余的构造

item25熟悉hash_map hash_set hash_multiset hash_multimap c++11已经使用unordered前缀,常数查找

迭代器重点在于iterator的原理

item26尽量使用iterator代替const_iterator等(这条不可取,新旧版实现不一样)

item27用distance和advance把const_iterator改成iteratori

tem28通过reverse_iterator得到iterator主要技巧,(++ri).base()

item29stream_iterator

算法

item30确保区间足够大,不大,那就back_inserterfront_inserter走起

item31了解你的排序选择掌握sortpartial_sortnth_elementstable_sortpartitionstable_partition原理

item32erase_remove惯用法 (unique也得这样用)

item33指针容器,remove有问题,(所以说得用shared_ptr托管)或者用partition

item34注意有些算法需要有序区间 理解这些算法的原理

binary_searchlower_boundupper_boundequal_rangeset_unionset_intersectionset_differenceset_symmetric_differencemergeimplace_mergeincludes

item35字符串比较mismatchlexicographical_compare或者strcmp s.c_str()也行

item36了解copy_if的正确实现需要理解copy replace-copy replace_copy_if remove_copy remove_copy_if reverse_copy copy_backward unique_copy rotate_copy partial_sort_copy unintialized_copy

item 37 统计区间,accumulatefor_each

仿函数,函数相关

item38函数对象是值传递

item39谓词不要有副作用

item40使仿函数可适配,指的是binary_function那套,这个不用了,std::bind来善后

item41了解 ptr_fun mem_fun mem_fun_ref就是一套适配,来抽出类中的方法ptr_fun已经弃用,用std::function来代替

item42确定less<T> 表示operator<

使用STL编程

item43 尽量使用算法调用代替手写循环

item44 尽量使用成员函数代替同名算法

item45注意countfindbinary_search lower_bound upper_bound equal-range的区别

item46考虑使用函数对象代替函数做算法的参数让编译器去优化(内联operator()())

item47代码可读性,不要图爽调用串,可能后面维护看不懂

item48 #include适当的文件,不过这条现代编译器处理下开销不大

item49读懂STL编译信息

item50熟悉STL网站

0
0

查看更多豆瓣高分好书

回应(0)

添加回应

Effective STL中文版的更多书评

推荐Effective STL中文版的豆列

了解更多图书信息

豆瓣
免费下载 iOS / Android 版客户端