[4] 在定义一种新功能时,应考虑它是否能纳入标准库所提供的框架中。
[5] 记住标准库功能都定义在名字空间std 里。
[6] 通过包含保准卡头文件声明其功能,不要自己另行显式声明。
[7] 利用后续抽象的优点。
[8] 避免肥大的界面。
[9] 与自己写按照反向顺序的显式循环相比,最好是写利用反向迭代器的算法。
[10] 用base()从reverse_iterator 抽取出iterator。
[11] 通过引用传递容器。
[12] 用迭代器类型,如list
[13] 在不需要修改容器元素时,使用const 迭代器。
[14] 如果希望检查访问范围,请(直接或间接)使用at()。
[15] 多用容器和push_back()或resize(),少用数组和realloc().
[16] vector 改变大小之后,不要使用指向其中的迭代器。
[17] 利用reserve()避免使迭代器非法。
[18] 在需要的时候,reserve()可以使执行情况更容易预期。
第17 章标准库容器
[1] 如果要用容器,首先考虑用vector。
[2] 了解你经常使用的每个操作的代价(复杂性,大O 度量)。
[3] 容器的界面、实现和表示使不同的概念,不要混淆。
[4] 你可以依据多种不同准则去排序和搜索。
[5] 不要用C 风格的字符串作为关键码,除非你提供了一种适当的比较准则。
[6] 你可以定义这样的比较准则,使等价的但是不相同的关键码值映射到同一个关键码。
[7] 在插入和删除元素时,最好时使用序列末端的操作(back 操作)。
[8] 当你需要在容器的前端或中间做许多插入和删除时,请用list。
[9] 当你主要通过关键码访问元素时,请用map 或multimap。
[10] 尽量用最小的操作集合,以取得最大的灵活性。
[11] 如果要保持元素的顺序性,选用map 而不是hash_map。
[12] 如果查找速度极其重要,选hash_map 而不是map。
[13] 如果无法对元素定义小于操作时,选hash_map 而不是map。
[14] 当你需要检查某个关键码是否在关联容器里的时候,用find()。
[15] 用equal_range()在关联容器里找出所有具有给定关键码的所有元素。
[16] 当具有同样关键码的多个值需要保持顺序时,用multimap。
[17] 当关键码本身就是你需要保存的值时,用set 或multiset。
第18 章算法和函数对象
[1] 多用算法,少用循环。
[2] 在写循环时,考虑是否能将它表述为一个通用的算法。
[3] 常规性地重温算法集合,看卡是不是能将新应用变得更明晰。
[4] 保证一对迭代器参数确实表述了一个序列。
[5] 设计时应该让使用最频繁的操作时简单而安全的。
[6] 吧测试表述成能够作为谓词使用的形式。
[7] 切记谓词是函数和对象,不是类型。
[8] 你可以用约束器从二元谓词做出一元谓词。
[9] 利用mem_fun()和mem_fun_ref()将算法应用于容器。
[10] 当你需要将一个参数约束到一个函数上时,用ptr_fun()。
[11] 切记srrcmp()用0 表示“相等”,与==不同。
[12] 仅在没有更特殊的算法时,才使用for_each()和tranform()。
[13] 利用谓词,以便能一各种比较准则和相等准则使用算法。
[14] 利用谓词和其他函数对象,以使标准算法能用于表示范围广泛的意义。
[15] 运算符<和==在指针上的默认意义很少适用于标准算法。
[16] 算法并不直接为它们的参数序列增加或减少元素。
[17] 应保证用于同一个序列的小于和相等谓词相互匹配。
[18] 有时排好序的序列用起来更有效且优雅。
[19] 仅为兼容性而使用qsort()和bsearch()。
第19 章迭代器和分配器
[1] 在写一个算法时,设法确定需要用哪种迭代器才能提供可接受的效率,并(只)使用这种迭代器所支持的操作符去表述算法。
[2] 当给定的迭代器参数提供了多于算法所需的最小支持时,请通过重载为该算法提供效率更高的实现。
[3] 利用istream_traits 为不同迭代器类别描述适当的算法。
[4] 记住在istream_iterator 和ostream_iterator 的访问之前使用++。
[5] 用插入器避免容器溢出。
[6] 在排错时使用额外的检查,后面只在必须时才删除这些检查。
[7] 多用++p,少用p++。
[8] 使用未初始化的存储去改善那些扩展数据结构的算法性能。
[9] 使用临时缓冲区去改善需要临时数据结构的算法的性能。
[10] 在写自己的分配器之前三思。
[11] 避免malloc()、free()、realloc()等。
[12] 你可以通过为rebind 所用的技术去模拟对模板的typedef。
第20 章串
[1] 尽量使用string 操作,少用C 风格字符串函数。
[2] 用string 作为变量或者成员,不作为基类。
[3] 你可以将string 作为参数值或者返回值,让系统去关心存储管理问题。
[4] 当你希望做范围检查时,请用at()而不是迭代器或者[]。
[5] 当你希望优化速度时,请用迭代器或[]而不是at()。
[6] 直接或者间接地使用substr()去读字子串,用replace()去写子串。
[7] 用find()操作在string 里确定值的位置(而不是写一个显式的循环)。
[8] 在你需要高效率地添加字符时,请在string 的后面附加。
[9] 在没有极端时间要求情况下用string 作为字符输入的目标。
[10] 用string::npos 表示“sring 的剩余部分”。
[11] 如果必要,就采用低级操作去实现极度频繁使用的strng(而不是到处用低级数据结构)。
[12] 如果你使用string,请在某些地方捕捉length_error 和out_of_rang 异常、
[13] 小心,不要将带值0 的char*传递给字符串函数。
[14] 只是到必须做的时候,(再)用c_str()产生string 的C 风格表示。
[15] 当你需要知道字符串的类别时,用isalpha()、isdigit()等函数,不要自己去写对字符值的检测。
第21 章流
[1] 在为用户定义类型的值定义<<和>>时,应该采用意义清晰的正文表达形式。
[2] 在打印包含低优先级运算符的表达式时需要用括号。
[3] 在添加新的<<和>>运算符时,你不必修改istream 或ostream。
[4] 你可以定义函数,时其能基于第二个(或更后面的)参数,具有像virtual 函数那样的行为。
[5] 切记,按默认约定>>跳过所有空格。
[6] 使用低级输入函数(如get()和read())主要是为了实现高级输入函数。
[7] 在使用get()、getline()和read()时留心其终止准则。
[8] 在控制I/O 时,尽量采用操控符,少用状态标志。
[9] (只)用异常去捕捉罕见的I/O 错误。
[10] 联结用于交互式I/O 的流。
[11] 使用哨位将许多函数的入口和出口代码集中到一个地方。
[12] 在无参数操控符最后不要写括号。
[13] 使用标准操控符式应记住写#include
[14] 你可以通过定义一个简单函数对象得到三元运算符的效果(和效率)。
[15] 切记,width 描述只应用于随后的一个I/