笔记,不值得看。以前记在印象笔记的,搬迁出来做个记录

容器

item1 根据需求选择容器

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

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

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

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

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

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

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

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

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

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

vector和string

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

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

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

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

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

item18 fuck vector<bool> deque<bool> bitset<N>

关联容器

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

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

item21 关联容器中的严格弱序

item22 避免改Key const_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改成iterator

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

item29 stream_iterator

算法

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

item31 了解你的排序选择 掌握sort partial_sort nth_element stable_sort partition stable_partition原理

item32 erase_remove惯用法 (unique也得这样用)

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

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

binary_search lower_bound upper_bound equal_range set_union set_intersection set_difference set_symmetric_difference merge implace_merge includes

item35 字符串比较 mismatch lexicographical_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 统计区间,accumulate for_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 注意count find binary_search lower_bound upper_bound equal-range 的区别

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

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

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