STL学习笔记——关联式容器(二级容器)
来源:互联网 发布:网络管理视频教程下载 编辑:程序博客网 时间:2024/06/06 04:58
关联式容器(非线性结构,元素是有序的集合,键值存储)
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;
阅读全文
0 0
- STL学习笔记——关联式容器(二级容器)
- STL — 关联容器
- 《STL源码剖析》学习笔记系列之五——关联式容器(2)
- 《STL源码剖析》学习笔记系列之五——关联式容器(1)
- STL组件——容器(关联容器)
- stl之关联容器学习笔记1
- stl之关联容器学习笔记2
- stl之关联容器学习笔记1
- stl之关联容器学习笔记2
- STL-学习笔记:关联容器
- STL—— 关联容器
- STL关联容器—multimap
- STL关联容器—map
- STL关联容器—set
- 【STL】关联容器 — 红黑树
- 【STL】关联容器 — set
- 【STL】关联容器 — map
- 【STL】关联容器 — hashtable
- [门户自用]解决cms门户后台模板页面报错问题 原因,可能缺少以下表JC_DIRECTIVE_TPL
- Python 简介
- 3DSlicer24:Module-Create Scripted
- 8.23模拟赛
- 在QT实现文件传输
- STL学习笔记——关联式容器(二级容器)
- web前端RxJS初步学习
- LintCode-----31.数组划分
- HDU 5893List wants to travel(树链剖分-区间合并-区间更新-入边)
- log4j 详细讲解
- unity3d 5.6烘焙教程 持续更新中
- 如何把JAVA程序做成Windows服务,并开机运行
- 断点续传大文件,视频
- GitHub上传代码的方法以及出现的一些错误的解决办法