赞
踩
前面介绍的 map/multimap、set/multiset
底层都是基于红黑树实现的,复杂度大致在
O
(
l
o
g
n
)
O(logn)
O(logn),本次介绍的容器底层都是基于哈希(hash)表
,具有很快的映射速度。
基于哈希表,数据的插入和查找的时间复杂度都很低,几乎是常数时间,而代价是需要消耗比较多的内存,因为底层实现一般是用一个下标范围比较大的数组来存储元素,形成很多的桶,然后利用hash函数对键值key进行映射,映射到不同的桶中进行存储。
常见的基于哈希表的容器有unorder_map/multimap、unorder_set/multiset
,其复杂度如下:
上述四种容器采用哈希表实现,不同操作的时间复杂度为:
插入:O(1),最坏情况O(N)。
查看:O(1),最坏情况O(N)。
删除:O(1),最坏情况O(N)。
// 模板类型
template <
class key, // 键的类型
class T, // 值的类型
class Hash = hash<key>, // hash函数,STL提供了不同类型的hash函数实现,也可以自己实现
class Pred = equal_to<key>, // 判断两个键key是否相等,可以自己实现,接收两个参数,返回bool值
class Alloc = allocator< pair<const Key,T> > // 内存构造器
> class unorder_map;
迭代unorder_map()元素会返回一个键值对,因此定义了一个 value_type
类型的返回值类,第一个值为键,第二个值为对应的值
typedef pair<const key,T> value_type;
返回的是对于键值对的引用,即指针,所以需要解引用
unordered_map<Key,T>::iterator it;
(*it).first; // the key value (of type Key)
(*it).second; // the mapped value (of type T)
(*it); // the "element value" (of type pair<const Key,T>)
// or
it->first;
it->second;
1.非变动性操作
操作 | 含义 |
---|---|
c.size() | 返回元素个数 |
c.empty() | 判断容器是否为空 |
c.max_size() | 返回容器最大容纳数据的数量(固定值) |
2.迭代操作
操作 | 含义 |
---|---|
c.begin() | 返回一个迭代器,指向第一个元素(即是指向第一个数据的一个指针) |
c.end() | 返回一个迭代器(指针),指向最后一个元素的下一个位置(实际不存在) |
3.元素存取操作
操作 | 含义 |
---|---|
operator[k] | 返回键值等于k的键值对的引用,若k不存在,则不存在,则添加一个键等于k的序对 |
mapped_type& at ( const key_type& k ) | 根据Key值查找容器内元素,并返回map元素的引用,不存在时抛出异常 |
4.搜寻操作
操作 | 含义 |
---|---|
size_type count ( const key_type& key ) const; | 返回"键值等于key"的元素个数 |
iterator find ( const key_type& key ) | 返回"键值等于key"的第一个元素,找不到返回end() |
pair<iterator,iterator> equal_range ( const key_type& k ) | 返回"键值等于key"的元素区间,键的唯一性保证最多有一个 |
5.修改操作
emplace()
template <class... Args>
pair<iterator, bool> emplace ( Args&&... args );
如果key元素是唯一的,在unordered_map中插入新元素,使用Args作为元素构造函数的参数来构造这个新元素。参数为右值引用。
示例:
mymap.emplace ("NCC-1701", "J.T. Kirk");
即可插入相应的map元素
insert()
pair<iterator,bool> insert ( const value_type& val );
直接插入元素类型,返回pair类型,返回值pair第一元素是插入元素迭代器,第二元素表示操作是否成功
erase()
iterator erase ( const_iterator position );
size_type erase ( const key_type& k );
iterator erase ( const_iterator first, const_iterator last );
根据不同的索引擦除插槽中的元素.
clear()
void clear() noexcept;
删除容器内所有元素。
swap()
void swap ( unordered_map& ump )
交换两个容器的内容,两个容器的类型必须一致,但大小可以不同。
更多成员函数可到官网查看
unorder_set()也是使用hash表实现,一般适用于以下情况:
其函数名称大多数与unorder_map()类似,参考官网
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。