STL_问题集

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里原则是:效率优先, 安全次之。  因为安全可以通过后期增加来实现,但是却不能通过后期删减来去除。

你可能感兴趣的:(STL_问题集)