effective stl笔记
笔记,不值得看。以前记在印象笔记的,搬迁出来做个记录
容器
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适当的文件,不过这条现代编译器处理下开销不大