STL中HashTable HashMap HashSet Set Map MultiSet MultiMap总结

1.hashtable

hash_set、hash_map、hash_multiset、hash_multimap四个关联容器都是以hashtable为底层实现方法(技巧)。应该说,上述的四个关联式容器提供的api都是对hashtable原生态api的高层封装,因为hashtable本身都提供了它们所需要的基础api。主要思想是通过hash函数,把对象映射到一个较小的容器里面,并且保证时间复杂度。映射到较小容器很可能出现碰撞问题,解决的方法常见的有:线性探测,二次探测,开链法。STL利用vector来当容器,采用开链法来解决冲突,从而实现hashtable.hashtable只能处理char,int,short等类型,不能处理string,double,float类型,想要处理的话必须自己加hash function。

std::hashtable obj;

2.set是种随机存储的关联式容器,其关键词(key)和元素(value)是同一个值。set之中所有元素互不相同。set是通过红黑树来实现的,是默认排序的。

std::set s1;

std::set> s2;//默认小于比较器

std::set s3(s1);

std::set s4(s1.begin(),s1.end());//迭代器可以用指针代替


3.map是提供对象间一一映射关系的一种容器,它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

3.hashmap:提供对象间一一映射,底层由hashtable提供。

4.hashset:提供集合,底层由hashtable提供。与set相比较而言,在于数据量大时查询效率更高。

c++没有hashset,hashtable,hashmap,需要通过一定方式去引用外部库。

5.multiset,multimap:提供一key'对应多个对象,比如电话薄中一个用户可以有多个电话号码。

std::mutiset s1;

std::multimap m1;


容器

特性

所在头文件

向量vector

可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比,尤其对向量头的添加和删除的代价是惊人的高的

双端队列deque

基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度

表list

对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间。

队列queue

插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。

堆栈stack

堆栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则

集合set

由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。但是它是以牺牲插入删除操作的效率为代价的

多重集合multiset

和集合基本相同,但可以支持重复元素具有快速查找能力

映射map

由{键,值}对组成的集合,以某种作用于键对上的谓词排列。具有快速查找能力

多重集合multimap

比起映射,一个键可以对应多了值。具有快速查找能力


http://blog.csdn.net/byxdaz/article/details/4633826

http://vipjy2008.blog.163.com/blog/static/3720876720139281936791/

不错的总结


你可能感兴趣的:(C++知识)