前言
在C++98中,STL提供了底层为红黑树的结构的一系列关联式容器,在查询时效率可以达到logN,即使最差的情况下需要比较红黑树的高度次,当树中的节点较多时,查询的效率也不是很理想,最好的查询是,进行很少的比较次数就能将元素找出来,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构中的关联容器的使用方法是类似的,只是底层结构不同,这里只对unordered_map和unordered_set进行介绍。
目录
1.unordered_map
1.1unordered_map的介绍
1.unordered_map是存储<key,value>的键值对的关联式容器,其允许通过key快速索引到与之关联的value。
2.在unordered_map中键值对是唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
3.在内部,unorderd_map没有对应的<key,value>,按照特定的顺序排序,为了能在常数范围内找到key对应的value,unordered_map将相同哈希值的键值对放到相同的桶中。
4.unordered_map容器通过key访问单个元素的速度要比map快,但是它通常在遍历元素子集的范围内的迭代方面效率要低。
5.unordered_map实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value。
6.它的迭代器是前向迭代器(只支持正向遍历)。
1.2unordered_map的接口介绍
1.unordered_map的构造函数
函数声明 | 函数功能 |
unordered_map | 构造不同类型的 unordered_map对象 |
2.unordered_map的容量
函数声明 | 函数功能 |
bool empty()const | 检测unordered_map是否为空 |
size_t size()const | 获取 unordered_map的有效元素个数 |
3.unordered_map的迭代器
函数声明 | 函数功能 |
begin() | 获取unordered_map第一个元素的迭代器 |
end() | 获取unordered_map最后一个元素下一个位置的迭代器 |
cbegin() | 获取unordered_map第一个元素的const迭代器 |
cend() | 获取unordered_map最后一个位置的下一个位置的迭代器 |
4.unordered_map的元素访问
函数声明 | 函数功能 |
operator[] | 返回与key对应的value,没有一个默认值 |
注意:该函数中实际调用哈系桶的插入操作,用参数key与V()构造一个默认值往底层的哈系桶中插入,如果key不在哈系桶中,插入成功返回V(),插入失败,说明key已经在哈系桶中,将对应的value返回。
5.unordered_map的查询
函数声明 | 函数功能 |
iterator find(const K& key) | 返回对应key在哈系桶中的位置 |
size_t count(const K& key) | 返回哈系桶中关键码为key的键值对的个数 |
注意:unordered_map中的key是不能重复的,因此count函数的返回值最大是1.
6.unordered_map的修改操作
函数声明 | 函数定义 |
Insert | 向容器中插入key,value的键值对 |
erase | 删除容器中的键值对 |
void clear() | 清空容器中的有效元素的个数 |
void swap(unorder_map&) | 交换两个容器中的元素 |
7.unordered_map的桶操作
函数声明 | 函数功能 |
size_t bucket_count()const | 返回哈系桶的总个数 |
size_t bucket_size(size_t n)const | 返回n号桶中有效元素的总个数 |
size_t bucket(const K& key) | 返回元素所在的桶号 |
2.unordered_set
unordered_set和set的使用别无二致,这里推荐参考set的使用,set的使用。
#include<iostream>
#include<unordered_map>
#include<unordered_set>
#include<unordered_set>
using namespace std;
void TestUnordered_map()
{
unordered_map<string, string> ump;
//增
ump.insert(make_pair<string, string>("big", "大"));
ump.insert(make_pair<string, string>("long", "长"));
ump.insert(make_pair<string, string>("short", "短"));
ump.insert(make_pair<string, string>("known", "知道"));
ump.insert(make_pair<string, string>("eye", "眼睛"));
ump["haha"] = "哈哈";
ump["string"];
ump["left"] = "左";
for (auto& e : ump)
cout << e.first << ": " << e.second << endl;
std::unordered_map<string, string> ::iterator it = ump.begin();
while (it != ump.end())
{
cout << it->first << ":" << it->second << endl;
++it;
}
std::unordered_map<string,string>::iterator it1 = ump.find("left");//查
it1->second = "非左";//改
cout << it1->first << ":" << it1->second << endl;
ump.erase("string");//删
while (it != ump.end())
{
cout << it->first << ":" << it->second << endl;
++it;
}
}
void TestUnordered_set()
{
//插入
std::unordered_set<int> ust;
ust.insert(1);
ust.insert(3);
ust.insert(5);
ust.insert(2);
ust.insert(4);
ust.insert(6);
std::unordered_set<int>::iterator it = ust.begin();
while (it != ust.end())
{
cout << *it << " ";
++it;
}
ust.erase(1);
ust.erase(2);
std::unordered_set<int>::iterator it1 = ust.find(3);
cout << endl;
cout << *it1 << endl;
it = ust.begin();
while (it != ust.end())
{
cout << *it << " ";
++it;
}
}