江阴高新区建设促进服务中心网站,友情链接怎么弄,功能网站首页模板,宁波广告公司 #x1f4dd;个人主页#xff1a;Sherry的成长之路 #x1f3e0;学习社区#xff1a;Sherry的成长之路#xff08;个人社区#xff09; #x1f4d6;专栏链接#xff1a;C学习 #x1f3af;长路漫漫浩浩#xff0c;万事皆有期待 上一篇博客#xff1a;【C】STL… 个人主页Sherry的成长之路 学习社区Sherry的成长之路个人社区 专栏链接C学习 长路漫漫浩浩万事皆有期待 上一篇博客【C】STL详解五—— list的介绍及使用 文章目录 unordered系列关联式容器unordered_set的介绍unordered_set的使用unordered_set接口的使用unordered_multiset unordered_map的介绍unordered_map的使用unordered_map的定义方式unordered_map接口的使用unordered_multimap 总结 unordered系列关联式容器
在C98中STL提供了底层为红黑树结构的一系列关联式容器在查询时的效率可达到O(logN)即最差情况下需要比较红黑树的高度次当树中的结点非常多时查询效率也不理想。最好的查询是进行很少的比较次数就能够将元素找到因此在C11中STL又提供了4个unordered系列的关联式容器这四个容器与红黑树结构的关联式容器使用方式基本类似只是其底层结构不同。
unordered_set的介绍
unordered_set是不按特定顺序存储键值的关联式容器其允许通过键值快速的索引到对应的元素。
在unordered_set中元素的值同时也是唯一地标识它的key。
在内部unordered_set中的元素没有按照任何特定的顺序排序为了能在常数范围内找到指定的keyunordered_set将相同哈希值的键值放在相同的桶中。
unordered_set容器通过key访问单个元素要比set快但它通常在遍历元素子集的范围迭代方面效率较低。
它的迭代器至少是前向迭代器。
unordered_set的使用
unordered_set的定义方式 方式一 构造一个某类型的空容器。
unordered_setint us1; //构造int类型的空容器方式二 拷贝构造某同类型容器的复制品。
unordered_setint us2(us1); //拷贝构造同类型容器us1的复制品方式三 使用迭代器拷贝构造某一段内容。
string str(abcedf);
unordered_setchar us3(str.begin(), str.end()); //构造string对象某段区间的复制品unordered_set接口的使用
unordered_set当中常用的成员函数如下
成员函数 功能
insert 插入指定元素
erase 删除指定元素
find 查找指定元素
size 获取容器中元素的个数
empty 判断容器是否为空
clear 清空容器
swap 交换两个容器中的数据
count 获取容器中指定元素值的元素个数unordered_set当中迭代器相关函数如下
成员函数 功能
begin 获取容器中第一个元素的正向迭代器
end 获取容器中最后一个元素下一个位置的正向迭代器使用示例
#include iostream
#include unordered_set
using namespace std;int main()
{unordered_setint us;//插入元素去重us.insert(1);us.insert(4);us.insert(3);us.insert(3);us.insert(2);us.insert(2);us.insert(3);//遍历容器方式一范围forfor (auto e : us){cout e ;}cout endl; //1 4 3 2//删除元素方式一us.erase(3);//删除元素方式二unordered_setint::iterator pos us.find(1); //查找值为1的元素if (pos ! us.end()){us.erase(pos);}//遍历容器方式二迭代器遍历unordered_setint::iterator it us.begin();while (it ! us.end()){cout *it ;it;}cout endl; //4 2//容器中值为2的元素个数cout us.count(2) endl; //1//容器大小cout us.size() endl; //2//清空容器us.clear();//容器判空cout us.empty() endl; //1//交换两个容器的数据unordered_setint tmp{ 11, 22, 33, 44 };us.swap(tmp);for (auto e : us){cout e ;}cout endl; //11 22 33 44return 0;
}
unordered_multiset
unordered_multiset容器与unordered_set容器的底层数据结构是一样的都是哈希表其次它们所提供的成员函数的接口都是基本一致的这里就不再列举了这两种容器唯一的区别就是unordered_multiset容器允许键值冗余即unordered_multiset容器当中存储的元素是可以重复的。
#include iostream
#include unordered_set
using namespace std;int main()
{unordered_multisetint ums;//插入元素允许重复ums.insert(1);ums.insert(4);ums.insert(3);ums.insert(3);ums.insert(2);ums.insert(2);ums.insert(3);for (auto e : ums){cout e ;}cout endl; //1 4 3 3 3 2 2return 0;
}由于unordered_multiset容器允许键值冗余因此该容器中成员函数find和count的意义与unordered_set容器中的也有所不同
成员函数find 功能
unordered_set容器 返回键值为val的元素的迭代器
unordered_multiset容器 返回底层哈希表中第一个找到的键值为val的元素的迭代器成员函数count 功能
unordered_set容器 键值为val的元素存在则返回1不存在则返回0find成员函数可替代
unordered_multiset容器 返回键值为val的元素个数find成员函数不可替代unordered_map的介绍
unordered_map是存储key, value键值对的关联式容器其允许通过key值快速的索引到与其对应是value。
在unordered_map中键值通常用于唯一地标识元素而映射值是一个对象其内容与此键关联。键和映射值的类型可能不同。
在内部unordered_map没有对key, value按照任何特定的顺序排序为了能在常数范围内找到key所对应的valueunordered_map将相同哈希值的键值对放在相同的桶中。
unordered_map容器通过key访问单个元素要比map快但它通常在遍历元素子集的范围迭代方面效率较低。
unordered_map实现了直接访问操作符operator[]它允许使用key作为参数直接访问value。
它的迭代器至少是前向迭代器。
unordered_map的使用
unordered_map的定义方式
方式一 指定key和value的类型构造一个空容器。
unordered_mapint, double um1; //构造一个key为int类型value为double类型的空容器方式二 拷贝构造某同类型容器的复制品。
unordered_mapint, double um2(um1); //拷贝构造同类型容器um1的复制品方式三 使用迭代器拷贝构造某一段内容。
unordered_mapint, double um3(um2.begin(), um2.end()); //使用迭代器拷贝构造um2容器某段区间的复制品unordered_map接口的使用
unordered_map当中常用的成员函数如下
成员函数 功能
insert 插入键值对
erase 删除指定key值的键值对
find 查找指定key值的键值对
size 获取容器中元素的个数
empty 判断容器是否为空
clear 清空容器
swap 交换两个容器中的数据
count 获取容器中指定key值的元素个数除了上述的成员函数之外unordered_map容器当中还实现了[ ]运算符重载函数该重载函数的功能非常强大 若当前容器中已有键值为key的键值对则返回该键值对value的引用。 若当前容器中没有键值为key的键值对则先插入键值对key, value()然后再返回该键值对中value的引用。 unordered_map当中迭代器相关函数如下
成员函数 功能
begin 获取容器中第一个元素的正向迭代器
end 获取容器中最后一个元素下一个位置的正向迭代器使用示例
#include iostream
#include string
#include unordered_map
using namespace std;int main()
{unordered_mapint, string um;//插入键值对方式一构造匿名对象插入um.insert(pairint, string(1, one));um.insert(pairint, string(2, two));um.insert(pairint, string(3, three));//遍历方式一范围forfor (auto e : um){cout e.first - e.second ;}cout endl; //1-one 2-two 3-three//插入键值对方式二调用make_pair函数模板插入um.insert(make_pair(4, four));um.insert(make_pair(5, five));um.insert(make_pair(6, six));//遍历方式二迭代器遍历unordered_mapint, string::iterator it um.begin();while (it ! um.end()){cout it-first - it-second ;it;}cout endl; //1-one 2-two 3-three 4-four 5-five 6-six//插入键值对方式三利用[]运算符重载函数进行插入常用um[7] seven;um[8] eight;um[9] nine;for (auto e : um){cout e.first - e.second ;}cout endl; //9-nine 1-one 2-two 3-three 4-four 5-five 6-six 7-seven 8-eight//删除键值对方式一根据key值删除um.erase(5);//删除键值对方式二根据迭代器删除unordered_mapint, string::iterator pos um.find(7); //查找键值为7的键值对if (pos ! um.end()){um.erase(pos);}for (auto e : um){cout e.first - e.second ;}cout endl; //9-nine 1-one 2-two 3-three 4-four 6-six 8-eight//修改键值对方式一通过find获得迭代器通过迭代器修改pos um.find(1);if (pos ! um.end()){pos-second one/first;}//修改键值对方式二利用[]运算符重载函数进行修改常用um[2] two/second;for (auto e : um){cout e.first - e.second ;}cout endl; //9-nine 1-one/first 2-two/second 3-three 4-four 6-six 8-eight//容器中key值为3的键值对的个数cout um.count(3) endl;//容器的大小cout um.size() endl;//清空容器um.clear();//容器判空cout um.empty() endl;//交换两个容器的数据unordered_mapint, string tmp{ { 2021, before }, { 2022, now } };um.swap(tmp);for (auto e : um){cout e.first - e.second ;}cout endl; //2021-before 2022-nowreturn 0;
}unordered_multimap
unordered_multimap容器与unordered_map容器的底层数据结构是一样的都是哈希表其次它们所提供的成员函数的接口都是基本一致的这里就不再列举了这两种容器唯一的区别就是unordered_multimap容器允许键值冗余即unordered_multimap容器当中存储的键值对的key值是可以重复的。
#include iostream
#include string
#include unordered_map
using namespace std;int main()
{unordered_multimapint, string umm;//插入键值对允许键值重复umm.insert(make_pair(2022, 吃饭));umm.insert(make_pair(2022, 睡觉));umm.insert(make_pair(2022, 敲代码));for (auto e : umm){cout e.first - e.second ;}cout endl; //2022-吃饭 2022-睡觉 2022-敲代码return 0;
}由于unordered_multimap容器允许键值对的键值冗余因此该容器中成员函数find和count的意义与unordered_map容器中的也有所不同
成员函数find 功能
unordered_map容器 返回键值为key的键值对的迭代器
unordered_multimap容器 返回底层哈希表中第一个找到的键值为key的键值对的迭代器成员函数count 功能
unordered_map容器 键值为key的键值对存在则返回1不存在则返回0find成员函数可替代
unordered_multimap容器 返回键值为key的键值对的个数find成员函数不可替代其次由于unordered_multimap容器允许键值对的键值冗余调用[ ]运算符重载函数时应该返回键值为key的哪一个键值对的value的引用存在歧义因此在unordered_multimap容器当中没有实现[ ]运算符重载函数。
总结
今天我们比较详细地完成了 unordered_set、unordered_map的介绍及使用了解了一些有关的底层原理。接下来我们用哈希表封装出unordered_map和unordered_set。希望我的文章和讲解能对大家的学习提供一些帮助。 当然本文仍有许多不足之处欢迎各位小伙伴们随时私信交流、批评指正我们下期见~