1 , vector在空间不足里是会进行内存重分配, 而如果不幸你对其用了引用了, 则这个BUG可能会一直隐藏着直到内部内存分配后的情况才爆发,而你很难找出这个原因。
2 , numeric_limits可用于获取数据类型的极值
#include <tchar.h>
#include <limits>
printf("%d\n",numeric_limits<int>::max());
printf("%ld\n",numeric_limits<long>::max());
printf("%ld\n",std::max<long>(5,6));
3, 使用迭代器iterator时,循环条件应用 pos != coll.end()之类的,而不是用 pos < coll.end(). 因为前者的判断是通用型的,而后者的判断只适用于随机迭代器的情况。
4, 循环变量宜用++pos之类,而不应用pos++之类的。 因为前者效率更高,而后者会产生一个临时变量(效率低)
#include <algorithm>
5, ostream_iterator挺有用,例如copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
类似的还有
for_each; 对A区间的每个元素进行B函数操作。
transform; 对A区间的每个元素进行B函数操作,然后全部拷到C区间上。
find_if; 对A区间的每个元素进行B函数操作,并返回第一个B函数操作结果为真的元素。
sort; 对A区间的元素进行B函数操作以排序。
仿函数less<>用于升序函数判断。
仿函数greater<>用于降序函数判断。
6, remove用来删除逻辑元素, erase用来删除物理元素。 remove速度快,但陷井较多。 erase速度慢,但陷井少。 remove会返回一个逻辑区间的终点位置。
7, 一般来说,使用algorithm文件里的算法效率会不如使用容器本身提供的算法,因为algorithm的算法是一种通用的算法, 而容器可以针对自身的结构做出相应的优化。例如list的remove函数,容器本身可以通过调指针,而algorithm文件则是通过值传递来修改。 即是说, 容器自身的算法一般优于algorithm文件里的算法,但是用algorithm文件里的算法可以提供通用性(在改变容器时,不会出问题)。
8, 容器的元素多数都是通过拷贝构造函数生成的,所以要特别注意深拷贝的问题。 例如当元素含字符串时,要实现深拷贝的拷贝构造函数。
9, 容器的元素都是以副本的形式保存的, 删除时会自动删除副本。 所以其析构函数一定要实现。
10, 容器的元素只支持值传递,不支持引用。
11, 在容器中通过指针来实现引用时, 比较行为,排序行为要特别慎重,因为此时操作的对象是指针,而不是指向的内容。
12, STL里原则是:效率优先, 安全次之。 因为安全可以通过后期增加来实现,但是却不能通过后期删减来去除。