STL学习笔记— —无序容器(Unordered Container)
简单介绍
在头文件<unordered_set>和<unordered_map> 中定义
namespace std
{
template <typename T,
typename Hash = hash<T>,
typename EqPred = equal_to<T>,
typename Allocator = allocator<T> >
class unordered_set;
template <typename T,
typename Hash = hash<T>,
typename EqPred = equal_to<T>,
typename Allocator = allocator<T> >
class unordered_multiset;
template <typename Key, typename T,
typename Hash = hash<T>,
typename EqPred = equal_to<T>,
typename Allocator = allocator<pair<const Key, T> > >
class unordered_map;
template <typename Key, typename T,
typename Hash = hash<T>,
typename EqPred = equal_to<T>,
typename Allocator = allocator<pair<const Key, T> > >
class unordered_multimap;
}
unordered_set、unodered_multiset、unordered_map、unodered_multimap都是无序容器,都是以哈希表实现的。
unordered_set、unodered_multiset结构
unordered_map、unodered_multimap结构
Unord和multiUnord操作
构造、复制与析构
Unord c //默认构造函数;创建一个空无序容器
Unord c(bnum) //创建一个空无序容器,内部至少使用了bnum个桶
Unord c(bnum,hf) //创建一个空无序容器,内部至少使用了bnum个桶,hf作为哈希函数
Unord c(bnum,hf,cmp) //创建一个空无序容器,内部至少使用了bnum个桶,hf作为哈希函数,cmp用来识别相等的值
Unord c = c2 //复制构造函数。创建一个新的无序容器作为c2的副本(全部元素都被复制)
Unord c = c2 //复制构造函数;创建一个新的无序容器作为c2的副本(全部元素都被复制)
Unord c(rv) //移动构造函数;使用右值对象rv创建一个新无序容器
Unord c = rv //移动构造函数;使用右值对象rv创建一个新无序容器
Unord c(beg,end) //创建一个无序容器。并使用beg到end范围内的值进行初始化
Unord c(beg,end,bnum) //创建一个无序容器。并使用beg到end范围内的值初始化,内部至少使用了bnum个桶
Unord c(beg,end,bnum,hf) //创建一个无序容器。并使用beg到end范围内的值初始化。内部至少使用了bnum个桶,hf作为哈希函数
Unord c(beg,end,bnum,hf,cmp) //创建一个无序容器,并使用beg到end范围内的值初始化。内部至少使用了bnum个桶,hf作为哈希函数,cmp用来识别相等的值
Unord c(initlist) //创建一个无序容器,并使用初始化列表进行初始化
Unord c = initlist //创建一个无序容器,并使用初始化列表进行初始化
c.~Unord() //销毁全部元素并释放内存
在这里Unord可能是例如以下的一种:
unordered_set<Elem> //一个无序set,使用默认hash<>,默认比較equal_to<>
unordered_set<Elem,Hash> //一个无序set,使用Hash作为hash函数。默认比較equal_to<>
unordered_set<Elem,Hash,Cmp> //一个无序set,使用Hash作为hash函数,使用Cmp进行比較
unordered_multiset<Elem> //一个无序multiset。使用默认hash<>,默认比較equal_to<>
unordered_multiset<Elem,Hash> //一个无序multiset,使用Hash作为hash函数,默认比較equal_to<>
unordered_multiset<Elem,Hash,Cmp> //一个无序multiset。使用Hash作为hash函数。使用Cmp进行比較
unordered_map<Key,T> //一个无序map,使用默认hash<>。默认比較equal_to<>
unordered_map<Key,T,Hash> //一个无序map,使用Hash作为hash函数,默认比較equal_to<>
unordered_map<Key,T,Hash,Cmp> //一个无序map,使用Hash作为hash函数,使用Cmp进行比較
unordered_multimap<Key,T> //一个无序multimap,使用默认hash<>,默认比較equal_to<>
unordered_multimap<Key,T,Hash> //一个无序multimap,使用Hash作为hash函数。默认比較equal_to<>
unordered_multimap<Key,T,Hash,Cmp> //一个无序multimap,使用Hash作为hash函数,使用Cmp进行比較
布局操作
c.hash_function() //返回哈希函数
c.key_eq() //返回用于比較键的相等性的函数
c.bucket_count() //返回眼下桶的个数
c.max_bucket_count() //返回桶的可能的最大数目
c.load_factor() //返回眼下桶内的负载的元素数量
c.max_load_factor() //返回桶可以负载的最大元素数量
c.max_load_factor(val) //设置桶最大负责数量为val
c.rehash(bnum) //又一次生产哈希表,使桶的数目至少为bnum
c.reserve(num) //又一次生产哈希表,以至于有足够的空间存放num个元素
非变动性操作
c.empty() //推断容器是否为空,与size()==0同样。但可能更快
c.size() //返回当前元素数量
c.max_size() //返回可容纳的元素最大数量
c1 == c2 //推断c1与c2是否相等
c1 != c2 //推断c1与c2是否不相等。等同于!(c1==c2)
特殊查询操作
c.count(key) //返回键值为key的元素个数
c.find(key) //返回第一个键值为key的位置,若没找到返回end()
c.equal_range(key) //返回全部键值为key的范围。如key可以被插入的第一个位置到最后一个位置
赋值
c = c2 //将c2全部元素赋值给c
c = rv //将右值对象rv的全部元素移动赋值给c
c = initlist //使用初始化列表进行赋值
c1.swap(c2) //交换c1和c2的数
swap(c1,c2) //交换c1和c2的数
迭代器相关函数
c.begin() //返回一个前向迭代器,指向第一个元素
c.end() //返回一个前向迭代器,指向最后一个元素
c.cbegin() //返回一个前向常迭代器。指向第一个元素
c.cend() //返回一个前向常迭代器。指向最后一个元素
c.rbegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素
c.rend() //返回一个逆向迭代器。指向逆向迭代的最后一个元素
c.crbegin() //返回一个逆向常迭代器。指向逆向迭代的第一个元素
c.crend() //返回一个逆向常迭代器,指向逆向迭代的最后一个元素
插入和移除元素
c.insert(val) //插入一个val的副本,返回新元素位置(对Unord来说不论成功与否)
c.insert(pos,val) //插入一个val副本,返回新元素位置(pos应该是插入的搜寻起点)
c.insert(beg,end) //将范围beg到end的全部元素的副本插入到c(无返回值)
c.insert(initlist) //插入初始化列表的全部元素的副本(无返回值)
c.emplace(args...) //插入一个使用args初始化的元素副本,返回新元素位置(对Unord来说不论成功与否)
c.emplace_hint(pos,args...) //插入一个使用args初始化的元素副本,返回新元素位置(pos应该是插入的搜寻起点)
c.erase(val) //移除全部与val值相等的元素。并返移除的元素个数
c.erase(pos) //移除迭代器位置的元素,并返回下个元素的位置
c.erase(beg,end) //移除beg到end范围内的全部元素,并返回下个元素的位置
c.clear() //移除所以元素,清空容器
bucket接口
c.bucket_count() //返回眼下桶的个数
c.bucket(val) //返回值val会被查询到的桶的索引
c.bucket_size(buckidx) //返回buckidx桶内的元素个数
c.begin(buckidx) //返回buckidx桶内指向第一个元素的前向迭代器
c.end(buckidx) //返回buckidx桶内指向第一个元素的前向迭代器
c.cbegin(buckidx) //返回buckidx桶内指向第一个元素的前向常迭代器
c.cend(buckidx) //返回buckidx桶内指向第一个元素的前向常迭代器
把unordered_map当作关联数组使用
c[key] //返回一个指向键值为key的元素的引用。假设不存在就插入这个元素
c.at(key) //返回一个指向键值为key的元素的引用
STL学习笔记— —无序容器(Unordered Container)的更多相关文章
- STL学习笔记(一) 容器
0.前言随机访问迭代器: vector.string.dequeSTL的一个革命性的方面就是它的计算复杂性保证 条款01:慎重选择容器类型 c++提供的容器:标准STL序列容器:vector.stri ...
- STL学习笔记--特殊容器
容器配接器 (1) stack 栈 后进先出(LIFO), 头文件#include<stack> template<class _Ty, class _Container = deq ...
- STL学习笔记--各种容器的运用时机
如何选择最佳的容器类别? 缺省情况下应该使用vector.vector的内部结构简单,并允许随机存取,所以数据的存取十分方便灵活,数据的处理也够快. 如果经常要在序列的头部和尾部安插和移除元素,应采用 ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
随机推荐
- springMVC加载远程freemarker模板文件
在一个大网站里,有很多子域名,也就是有很多子系统,这些子系统由不同的团队负责,对整个网站的风格的风格至少得要是一致的(最基本的页头.页尾必须一致),这个时候得提供一份统一的页头.页尾以及公共的JS.c ...
- 由一次 symbol lookup error 引发的思考
开发一个跨平台的项目的时候,大部分时候都是在VS下进行编码,所以也就使用了VS的解决方案来管理项目. 因为要跨平台,当时网上看scons这个工具不错,所以在linux下就使用了scons来作为编译脚本 ...
- Weblogic部署gbk编码的项目乱码
问题描述: weblogic默认部署的项目编码utf-8,由于项目特殊编码gbk导致打开项目中文全是乱码! 心哇凉哇凉.... 问题解决: 01.调休jvm参数 xxx_domains/bin/set ...
- Win极速文件搜索Listary
对于开源的everything在win下搜索文件很高效了.不过在listary功能上更加的丰富..支持正则搜索 对比: 都是基于本地磁盘索引,进而实现快速搜素 00.有能力的还是购买pro,当然也有免 ...
- 通过socks tunnel设置http代理
1. 在服务器上使用ssh创建tunnel -f -C -q -N milton@112.34.113.35 # -D: 让ssh在指定的端口(-)上建立一个 SOCKS tunnel # -f: 让 ...
- django日志使用TimeRotateFileHandler
如果使用django的settings.py设置日志会产生一些问题. 问题描述 报错信息如下: Traceback (most recent call last): File "C:\Pyt ...
- QQ模仿之弹窗ADDFriend事件
大家自己分析吧 #pragma once //演示QQ2009 #define WINDOW_WIDTH 250 //窗口宽度 #define WINDOW_HEIGHT 600 //窗口高度 str ...
- 软件公司的两种管理方式 总体来说,这个世界上存在两种不同的软件公司的组织结构。我把他们叫做 Widget Factory(小商品工厂) 和 Film Crews(电影工作组
软件公司的两种管理方式 一个简单的回答应该是——“因为在我们的社会里,我们总是会认为薪水和会和职位的层次绑在一起”.但是,这个答案同时也折射出一个事实——我们的薪资是基于我们的所理解的价值,但这并没有 ...
- C语言学习笔记 (005) - 二维数组作为函数参数传递剖析
前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...
- python中,花括号,中括号,小括号的区别
python中,花括号,中括号,小括号的区别 Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list ...