前不久面试,面试官问了hash table 进而问了MAPS, 结果发现自己没有系统学过STL。只是在《Accelerated C++》、《C++ Prime plus》里看到一些STL内容,太少了!
以前项目中用过list,包括一些基础的iterator使用,但是面试的使用人家问我为什么选择list,而不是vector 或者别的容器。
我当时用的是TUIO的一套机制,它默认使用的就是list。所以感觉应该花些时间复习一下STL了!
(常用容器---vector list deque顺序容器,set map关联式容器。 )
()重新系统学习一下STL、用的是《C++标准程序库》经典教材。
1. utilities 通用工具
1.1 pairs (对组)
eg std::pair<int, float> p(4, 4.00);
应用场合:MAPS或者multi-MAPS(用于key/ value),或者是函数中需要返回两个数值。
1.2 auto_ptr(智能指针)----暂时省略
2.容器
2.1 Map 和 multi-maps
Map 和 multimap 将 key/value pair(键值/实值 对组)当作元素,进行管理。它们
可根据 key 的排序准则自动将元素排序。multimaps 允许重复元素,maps 不允许。
使用 map 和 multimap 之前,你必须先含入头文件 <map> :
#include <map>
2.1.1 Maps 和 Multimaps 的能力
和所有标准的关系型容器一样,maps/multimpas 通常以平衡二元树完成,
Map 和 multimaps 根据元素的 key 自动对元素进行排序。这么一来,根据已知的 key
搜寻某个元素时,就能够有很好的性能,而根据已知 value 搜寻元素时,性能就很
糟糕。「自动排序」这一性质使得 map 和 multimaps 身上有了一条重要的限制:
你不可以直接改变元素的 key,因为这会破坏正确次序。要修改元素的 key,你必
须先移除拥有该 key 的元素,然后插入拥有新的 key/value 的元素
2.1.2 Hash Tables
有一个数据结构可用于群集(collection)身上,非常重要,却未包含于 C++ 标准
链接库内,那就是 hash table。最初的 STL 并未涵盖 hash table,然而确实曾有提
案要求,将 hash table 并入标准规格。但是标准委员会觉得这份提议来得太晚,没
有采纳。(我们必须在某个时间点中止引入新功能,开始关注细节,否则工作永
无止境)
不过,C++ 社群早已经有了数种可用的 hash table 实作版本。一般而言链接库会
提供㆕种 hash table:hash_set, hash_multiset, hash_map, hash_multimap。和其他关
联式容器一样,"multi" 版允许元素重复,"map" 版的元素是个 key/value pair。Bjarne
Stroustrup 在其《The C++ Programming Language》第三版 17.6 节中曾经实作一个
hash_map 容器作为示范,并进行详细讨论。关于 hash table 的具体实现,可参见
STLport(http:://www.stlport.org)。当然,由于 hash table 尚未正规化,所以不同
的实作版本可能在细节上有所不同。(译注:如果你对 hash table 的运用和设计原
理感兴趣,请参考《STL 源码剖析》by 侯捷, 碁峰 2002,5.7 节~5.11 节。该处讨
论的是 SGI STL 实作版本,涵括底层 hash table 和外显接口 hash_set, hash_multiset,
hash_map, hash_multimap)