unordered_set和unordered_map的基本使用
- unordered_set
- unordered_set的使用
- unordered_set的定义方式
- unordered_set的常用接口
- unordered_multiset
- unordered_map
- unordered_map的定义方式
- unordered_map的主要接口使用
- unordered_multimap
🔒快速导航关联在一起的文章
🔒
文章名称 | 链接 |
---|
二叉搜索树 | 点击直达文章 |
set和map的基本使用 | 点击直达文章 |
AVL树 | 点击直达文章 |
红黑树 | 点击直达文章 |
💡C++标准库超链接💡
unordered_set
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。
unordered_set的介绍:
- unordered_set不是按特定顺序存储键值的容器,其允许通过键值快速的索引到与其对应的元素。
- unordered_set在内部,中的元素不是按任何特定顺序排序的,为了实现在常数范围内找到key,unorder_set把相同的哈希值放在哈希桶中。
- unordered_set元素的值同时也是唯一表示它们的key.
- unordered_set 容器比 set 容器更快地通过它们的键访问单个元素,尽管它们通常对于通过其元素的子集进行范围迭代的效率较低。
- 容器中的迭代器至少是前向迭代器。
unordered_set的使用
unordered_set的定义方式
常用的2种方式,库里还有几种,感兴趣的可以看看,链接在上面。
方式一
:构造某种类型的空容器
unordered_set<int> uns1;
方式二
&#xff1a;拷贝构造同类型的容器
unordered_set<int> uns2(uns1);
unordered_set的常用接口
它的接口的使用跟set的接口使用是一样的。常用的接口如下&#xff1a;
成员函数 | 功能 |
---|
insert | 插入元素 |
erase | 删除元素 |
find | 查找指定元素 |
size | 获取容器中元素的个数 |
empty | 判断容器是否为空 |
clear | 清除数据 |
swap | 交换2个容器的数据 |
count | 获取容器中的有效元素的个数 |
unordered_set的迭代器
begin | 返回第一个元素的迭代器 |
---|
end | 返回最后一个元素下一个位置的迭代器 |
cbegin | 返回第一个元素的const迭代器 |
cend | 返回最后一个元素下一个位置的const迭代器 |
示例如下&#xff1a;
void Test_unordered_set1()
{unordered_set<int> uns1;uns1.insert(2);uns1.insert(10);uns1.insert(4);uns1.insert(13);uns1.insert(2);uns1.insert(12);unordered_set<int>::iterator it &#61; uns1.begin();while (it !&#61; uns1.end()){cout << *it << " ";&#43;&#43;it;}cout << endl;for (auto e : uns1){cout << e << " ";}cout << endl;uns1.erase(2);unordered_set<int>::iterator pos &#61; uns1.find(10);if(pos !&#61; uns1.end()){uns1.erase(pos);}for (auto e : uns1){cout << e << " ";}cout << endl;
}
其他的接口就不在这里使用了&#xff0c;效果如下&#xff1a;
✨✨✨✨✨✨✨✨✨✨✨我是分割线✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
unordered_multiset
unordered_multiset和unordered_set的底层都是一样的&#xff0c;都是哈希表。它们接口的使用基本是一致的。区别就是unordered_multiset允许键值冗余。
示例如下&#xff1a;
void Test_unordered_multiset1()
{unordered_multiset<int> unm1;unm1.insert(2);unm1.insert(10);unm1.insert(13);unm1.insert(2);unm1.insert(10);unm1.insert(56);unm1.insert(2);auto it &#61; unm1.begin();while (it!&#61;unm1.end()){cout << *it << " ";&#43;&#43;it;}cout << endl;for (const auto& e : unm1){cout << e << " ";}cout << endl;
}
unordered_map
unordered_map的简单介绍&#xff1a;
- unordered_map是存储键值对的关联式容器&#xff0c;其允许通过keys快速的索引到与其对应的value。
- 在unordered_map中&#xff0c;键值通常用于惟一地标识元素&#xff0c;而映射值是一个对象&#xff0c;其内容与此键关联。键和映射值的类型可能不同。
- 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value&#xff0c;unordered_map将相同哈希值的键值对放在相同的桶中。
- unordered_map容器通过key访问单个元素要比map快&#xff0c;但它通常在遍历元素子集的范围迭代方面效率较低。
- unordered_maps实现了直接访问操作符(operator[])&#xff0c;它允许使用key作为参数直接访问value。
- 它的迭代器至少是前向迭代器。
unordered_map的定义方式
**方式一&#xff1a;**构造指定key和value的类型的容器
unordered_map<string, string> unm;
**方式二&#xff1a;**拷贝构造
unordered_map<string, string> unm1(unm);
unordered_map的主要接口使用
成员函数 | 功能 |
---|
insert | 插入键值对 |
erase | 删除指定key值的键值对 |
find | 查找指定的key值的键值对 |
size | 获得容器中元素的个数 |
clear | 清空容器 |
swap | 交换2个容器的数据 |
count | 获取指定的key值的元素个数 |
operator[]
1.当前容器中已经有了key值的键值对&#xff0c;返回该键值对value的引用
2.当前容器中没有key值的键值对&#xff0c;先插入,然后在返回键值对中value的引用
unordered_map的迭代器
函数 | 功能 |
---|
begin | 返回第一个元素的迭代器 |
end | 返回最后一个元素下一个位置的迭代器 |
cbegin | 返回第一个元素的const迭代器 |
cend | 返回最后一个元素下一个位置的const迭代器 |
示例如下&#xff1a;
void Test_unordered_map1()
{unordered_map<string,string> unm;unm.insert(make_pair("left", "左边"));unm.insert(make_pair("sort", "排序"));unm.insert(make_pair("right", "右边"));unm.insert(make_pair("left", "左边"));unm.insert(make_pair("big", "大的"));unm["small"] &#61; "小的";unordered_map<string, string>::iterator it &#61; unm.begin();while (it !&#61; unm.end()){cout << it->first << ":" << it->second << " ";&#43;&#43;it;}cout << endl;for (const auto& e : unm){cout << e.first << ":" << e.second << " ";}cout << endl;unm.erase("left");auto pos &#61; unm.find("sort");if (pos !&#61; unm.end()){unm.erase(pos);}for (const auto& e : unm){cout << e.first << ":" << e.second << " ";}cout << endl;
}
效果如下&#xff1a;
其他的一些接口就不使用了。
unordered_multimap
跟上面的是一样的&#xff0c;unordered_multimap允许键值冗余。
示例如下&#xff1a;
void Test_unordered_multimap1()
{unordered_multimap<int, string> unmutmap;unmutmap.insert(make_pair(1, "one"));unmutmap.insert(make_pair(10, "ten"));unmutmap.insert(make_pair(2, "two"));unmutmap.insert(make_pair(5, "five"));unmutmap.insert(make_pair(10, "ten"));unmutmap.insert(make_pair(10, "ten"));for (const auto& e : unmutmap){cout << e.first << ":" << e.second << " ";}cout << endl;unordered_multimap<int, string>::iterator it &#61; unmutmap.begin();while (it!&#61; unmutmap.end()){cout << it->first << ":" << it->second << " ";&#43;&#43;it;}cout << endl;
}
unordered_multimap允许键值对存在冗余&#xff0c;调用[]时&#xff0c;返回键值为key的value的引用存在歧义&#xff0c;所以没有实现[]。本篇文章到这就结束了。