加入收藏 | 设为首页 | 会员中心 | 我要投稿 昌吉站长网 (https://www.0994zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ STL unordered_multiset容器说明

发布时间:2022-07-15 17:14:59 所属栏目:语言 来源:互联网
导读:前面章节详细地介绍了 unordered_set 容器的特定和用法,在此基础上,本节再介绍一个类似的 C++ STL 无序容器,即 unordered_multiset 容器。 所谓类似,指的是 unordered_multiset 容器大部分的特性都和 unordered_set 容器相同,包括: unordered_multis
  前面章节详细地介绍了 unordered_set 容器的特定和用法,在此基础上,本节再介绍一个类似的 C++ STL 无序容器,即 unordered_multiset 容器。
 
  所谓“类似”,指的是 unordered_multiset 容器大部分的特性都和 unordered_set 容器相同,包括:
  unordered_multiset 不以键值对的形式存储数据,而是直接存储数据的值;
  该类型容器底层采用的也是哈希表存储结构(可阅读《C++ STL无序容器底层实现原理》一文做详细了解),它不会对内部存储的数据进行排序;
  unordered_multiset 容器内部存储的元素,其值不能被修改。
 
  和 unordered_set 容器不同的是,unordered_multiset 容器可以同时存储多个值相同的元素,且这些元素会存储到哈希表中同一个桶(本质就是链表)上。
  读者可以这样认为,unordered_multiset 除了能存储相同值的元素外,它和 unordered_set 容器完全相同。
 
  另外值得一提的是,实现 unordered_multiset 容器的模板类并没有定义在以该容器名命名的文件中,而是和 unordered_set 容器共用同一个<unordered_set>头文件,并且也位于 std 命名空间。因此,如果程序中需要使用该类型容器,应包含如下代码:
  #include <unordered_set>
  using namespace std;
  注意,第二行代码不是必需的,但如果不用,则程序中只要用到该容器时,必须手动注明 std 命名空间(强烈建议初学者使用)。
 
  unordered_multiset 容器类模板的定义如下:
  template < class Key,            //容器中存储元素的类型
             class Hash = hash<Key>,    //确定元素存储位置所用的哈希函数
             class Pred = equal_to<Key>,   //判断各个元素是否相等所用的函数
             class Alloc = allocator<Key>   //指定分配器对象的类型
             > class unordered_multiset;
  需要说明的是,在 99% 的实际场景中,最多只需要使用前 3 个参数(各自含义如表 1 所示),最后一个参数保持默认值即可。
 
  表 1 unordered_multiset 模板类定义
  参数 含义
  Key 确定容器存储元素的类型,如果读者将 unordered_multiset 看做是存储键和值相同的键值对的容器,则此参数则用于确定各个键值对的键和值的类型,因为它们是完全相同的,因此一定是同一数据类型的数据。
  Hash = hash<Key> 指定 unordered_multiset 容器底层存储各个元素时所使用的哈希函数。需要注意的是,默认哈希函数 hash<Key> 只适用于基本数据类型(包括 string 类型),而不适用于自定义的结构体或者类。
  Pred = equal_to<Key> 用于指定 unordered_multiset 容器判断元素值相等的规则。默认情况下,使用 STL 标准库中提供的 equal_to<key> 规则,该规则仅支持可直接用 == 运算符做比较的数据类型。
  总之,如果 unordered_multiset 容器中存储的元素为自定义的数据类型,则默认的哈希函数 hash<key> 以及比较函数 equal_to<key> 将不再适用,只能自己设计适用该类型的哈希函数和比较函数,并显式传递给 Hash 参数和 Pred 参数。至于如何实现自定义,后续章节会做详细讲解。
 
  创建C++ unordered_multiset容器
  考虑到不同场景的需要,unordered_multiset 容器模板类共提供了以下 4 种创建 unordered_multiset 容器的方式。
 
  1) 调用 unordered_multiset 模板类的默认构造函数,可以创建空的 unordered_multiset 容器。比如:
  std::unordered_multiset<std::string> umset;
  如果程序已经引入了 std 命名空间,这里可以省略所有的 std::。
 
  由此,就创建好了一个可存储 string 类型值的 unordered_multiset 容器,该容器底层采用默认的哈希函数 hash<Key> 和比较函数 equal_to<Key>。
 
  2) 当然,在创建 unordered_multiset 容器的同时,可以进行初始化操作。比如:
  std::unordered_multiset<std::string> umset{ "http://c.biancheng.net/c/",
                                              "http://c.biancheng.net/java/",
                                              "http://c.biancheng.net/linux/" };
  通过此方法创建的 umset 容器中,内部存有 3 个 string 类型元素。
 
  3)  当然,如果不想全部拷贝,可以使用 unordered_multiset 类模板提供的迭代器,在现有 unordered_multiset 容器中选择部分区域内的元素,为新建 unordered_multiset 容器初始化。例如:
  //传入 2 个迭代器,
  std::unordered_multiset<std::string> umset2(++umset.begin(), umset.end());
  通过此方式创建的 umset2 容器,其内部就包含 umset 容器中除第 1 个元素外的所有其它元素。

(编辑:昌吉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!