最近几天我要整理一下遇到的STL的函数,本来其实我是没有打算学的,认为用C就完全可以实现,干嘛要记那么多复杂的函数呢,所以我之前的做法都是将常用的C函数自己做了一个lib库,使用起来也是蛮方便的呢,但是最近在做leetcode的题时,发现如果使用自己的函数来实现,不只是代码量迅速的上升,而且当遇到指针内存分配的时候,问题也就更复杂了,当看到人家调用几行的STL函数就把功能实现而且代码的可读性也非常的好。这就促使我要探一探STL的函数库。几天就先谈一谈STL::unordered_map吧,同时也学一下C++标准库的map和我最爱的C语言的hash。我自己认为这是很重要的几个数据结构,不管使用哪种语言。
1、hash
对于散列表的基础知识,许多博客都进行了非常详细的讲解,参考http://kb.cnblogs.com/page/189480/.
散列表需要两个条件:1)将输入转化为整数的一个散列函数 2)使用一个处理冲突的方法。
2、map
map是C++标准库函数,其实现方式是红黑树,其储存的key值都是有序的。
#include <map> 声明: map<string,int> words; 插入:words["vermeer"] = 1;
对字数统计:
while(cin>>tword)
words[tword]++;
map对象有两个数据成员,一个是first,另一个是second.
其成员函数主要包括:find(string str);如果str在里面则返回一个iterator 指向key/value形成的一个pair
count(string str):返回str在map内出现的个数,一般的map只能出现一次,如果需要储存多份相同的key值,就必须使用multimap,此处不做介绍。
其具体内容请参见:https://msdn.microsoft.com/zh-cn/library/kf18ek11.aspx
3、unordered_map
unordered_map不是C++的标准库函数,因此在跨平台操作时可能会出现不兼容的情况,因此请谨慎使用。
与map不同的是,unordered_map在内部不做任何的排序,其存储位置取决于哈希值允许直接通过其键值为快速访问单个元素(具有恒定平均的平均时间复杂度)
常用的成员函数:end()、find()、count()、insert()等。
其具体内容请参见:https://msdn.microsoft.com/zh-cn/library/bb982522.aspx