关联式容器
(非线性结构,元素是有序的集合,键值存储)
RB-tree
set
map
multiset
multimap
hashtable
hash_set
hash_map
hash_multiset
hash_multimap
1.RB-tree(二叉平衡搜索树,有自动排序功能)
2.set
1)所有的元素都会根据元素的键值自动被排序(默认升序),set元素的键值就是实值,set不允许两个元素有相同的键值;
2)set的迭代器为只读迭代器,set不允许通过迭代器修改元素值,键值无法被修改;
3)由于set底层由RB-tree实现,迭代器相当于指向结点的指针,增删元素时内存并没有发生“改变”(元素移动),因此指向内存的指针不会失效。所以在客户对它进行增删操作前后,所有的迭代器都不会失效,被删除元素的迭代器除外;
4)对于关联式容器应该使用其自身的find函数来搜寻元素,比STL算法find更有效率。
3.map
1)所有的元素都会根据元素的键值自动被排序(默认升序);map的所有元素都是pair,同时拥有键值和实值;
map不允许两个元素有相同的键值;
2)map允许通过迭代器修改元素值,但键值无法被修改(会影响元素的排列规则);
3)由于map底层由RB-tree实现,迭代器相当于指向结点的指针,增删元素时内存并没有发生“改变”(元素移动),因此指向内存的指针不会失效。所以在客户对它进行增删操作前后,所有的迭代器都不会失效,被删除元素的迭代器除外;
4)对于关联式容器应该使用其自身的find函数来搜寻元素,比STL算法find更有效率。
4.multiset允许元素的键值重复
5.multimap允许元素的键值重复
6.hashtable(无自动排序功能)
1)SGI-STL的hashtable使用开链法来解决冲突,采用哈希桶结构来存储结点,由vector<node*>和list-node组成;
2)hashtable的迭代器类型为forwarditerator,没有后退操作;
5)bucket(list)的容量即buckets[i]的容量,就是buckets的大小(即vector的大小);当元素数量超过容量时,表格会重建
重新申请一个vector,将原来的元素copy过来,然后释放原来的空间;
6)hashtable默认只能处理char,char*,const char*,int(unsinged int),short(unsinged short),long(unsinged long)类型
数据,欲处理上述类型之外的类型需要用户自定义hash function.
7.hash_set
hash_set底层由hashtable实现,除没有自动排序功能外,其余使用方法与set一致;
8.hash_map
hash_map底层由hashtable实现,除没有自动排序功能外,其余使用方法与map一致;
9.hash_multiset
10.hash_multimap
11.hash_map与map的使用注意
1)hash_map的底层是hashtable,理论上的平均操作复杂度是常数时间O(1);map的底层是RB-tree,理论上的操作平均复杂度是O(logN);
2)选用hash_map还是map,关键在于关键字的查询次数,以及关注的是整体查询时间还是单词查询时间;
若查询次数多,要求整体的查询效率,用hash_map;
若查询次数少,由于hashtable会有不确定的O(N),会影响整体效率,因此选map;
RB-tree
set
map
multiset
multimap
hashtable
hash_set
hash_map
hash_multiset
hash_multimap
1.RB-tree(二叉平衡搜索树,有自动排序功能)
2.set
1)所有的元素都会根据元素的键值自动被排序(默认升序),set元素的键值就是实值,set不允许两个元素有相同的键值;
2)set的迭代器为只读迭代器,set不允许通过迭代器修改元素值,键值无法被修改;
3)由于set底层由RB-tree实现,迭代器相当于指向结点的指针,增删元素时内存并没有发生“改变”(元素移动),因此指向内存的指针不会失效。所以在客户对它进行增删操作前后,所有的迭代器都不会失效,被删除元素的迭代器除外;
4)对于关联式容器应该使用其自身的find函数来搜寻元素,比STL算法find更有效率。
3.map
1)所有的元素都会根据元素的键值自动被排序(默认升序);map的所有元素都是pair,同时拥有键值和实值;
map不允许两个元素有相同的键值;
2)map允许通过迭代器修改元素值,但键值无法被修改(会影响元素的排列规则);
3)由于map底层由RB-tree实现,迭代器相当于指向结点的指针,增删元素时内存并没有发生“改变”(元素移动),因此指向内存的指针不会失效。所以在客户对它进行增删操作前后,所有的迭代器都不会失效,被删除元素的迭代器除外;
4)对于关联式容器应该使用其自身的find函数来搜寻元素,比STL算法find更有效率。
4.multiset允许元素的键值重复
5.multimap允许元素的键值重复
6.hashtable(无自动排序功能)
1)SGI-STL的hashtable使用开链法来解决冲突,采用哈希桶结构来存储结点,由vector<node*>和list-node组成;
2)hashtable的迭代器类型为forwarditerator,没有后退操作;
3)hashtable的迭代器必须永远维系着与整个“buckets vector”的关系,并记录目前所指的结点。(与deque类似)
4)SGI-STL采用质数来设计表格大小(即vector大小),先将28个质数(大小逐渐呈现两倍的关系)存入一个数组;
同时提供一个函数,用来查询在这28个质数之中,“最接近某数并大于某数”的质数。lower_bound()、upper_bound()5)bucket(list)的容量即buckets[i]的容量,就是buckets的大小(即vector的大小);当元素数量超过容量时,表格会重建
重新申请一个vector,将原来的元素copy过来,然后释放原来的空间;
6)hashtable默认只能处理char,char*,const char*,int(unsinged int),short(unsinged short),long(unsinged long)类型
数据,欲处理上述类型之外的类型需要用户自定义hash function.
7.hash_set
hash_set底层由hashtable实现,除没有自动排序功能外,其余使用方法与set一致;
8.hash_map
hash_map底层由hashtable实现,除没有自动排序功能外,其余使用方法与map一致;
9.hash_multiset
10.hash_multimap
11.hash_map与map的使用注意
1)hash_map的底层是hashtable,理论上的平均操作复杂度是常数时间O(1);map的底层是RB-tree,理论上的操作平均复杂度是O(logN);
2)选用hash_map还是map,关键在于关键字的查询次数,以及关注的是整体查询时间还是单词查询时间;
若查询次数多,要求整体的查询效率,用hash_map;
若查询次数少,由于hashtable会有不确定的O(N),会影响整体效率,因此选map;