C++ UNORDERED_MAP

28 Aug 2024 | 5 分钟阅读

无序映射 (unordered map) 是一种关联容器,它存储由键值和映射值融合而成的元素。元素由其键值唯一标识,映射值是与键相关联的内容。键和值都可以是任何已建立的或用户定义的类型。无序映射可以被认为是字典类型的数据结构,它将元素存储在自身中。它持有的顺序对(键,值)可以通过其单个键快速检索特定元素。

提供给映射的键被哈希到哈希表的索引中,这就是为什么数据结构的速度很大程度上取决于哈希函数,但平均而言,从哈希表中进行搜索、插入和删除的成本是 o(1)。

在最坏的情况下,特别是对于大的素数整数,其时间复杂度可以从o(1)o(n)。在这种情况下,强烈建议使用 map 以避免出现 tle (时间限制超出)问题。

语法

示例

输出

Distribute 40
Regular 30
Javatpoint 20

说明

此输出特别证明了无序映射的输出值是按随机键到值的方式生成的,而映射则以有序方式显示值和键。

无序集合与无序映射

无序集合和无序映射之间的一些区别如下:

无序映射

  • 无序映射的元素中只找到(键-值)对。
  • 使用运算符"[]"从映射中提取键的相应值。

无序集合

  • 键-值对主要用于确定集合是否存在,并且不总是出现在无序集合中。
  • 使用find() 函数搜索元素。因此,不需要运算符。

重要提示

例如,考虑计算单个单词频率的问题。由于计数不能存储在无序集合(或集合)中,我们必须使用无序映射。

映射与无序映射

映射和无序映射之间的一些区别如下:

无序映射

  • 无序映射键可以按任何顺序存储。
  • 无序映射的实现导致不均匀的树结构,使其无法保留条目的顺序。
  • 无序映射上的操作通常具有o(1) 时间复杂度

Map

  • 映射是不同键的有序列表。
  • 由于 map 使用平衡树结构,因此可以保留元素的顺序(通过特定的树遍历)。
  • 映射操作的时间复杂度为o(log n)

无序映射的过程

有许多函数可以与无序映射一起使用。最有用的是:

  • 运算符 =
  • 运算符[]
  • 迭代器的开始和结束
  • 为空
  • 容量大小
  • 对于查找,定位和计数。
  • 插入和删除

无序映射的所有方法如下所示:

At()

这个 C++ 无序映射方法返回对以指定元素作为键 k的值的引用。

Begin()

它提供一个返回值,该返回值是一个迭代器,指向无序映射容器中的第一个条目。

End()

无序映射容器桶返回一个迭代器,指向最后一个元素之后的位置 ()。

Bucket()

它返回映射的桶计数中放置键 k 的元素的桶号。

Bucket_count()

无序映射的桶总数使用桶计数函数统计。它可以不带任何参数调用。

Bucket size

它给出无序映射计数中每个桶 ()的元素计数。

Count()

它给出无序映射计数中每个桶 ()的元素计数,应计算无序映射中具有指定键相等范围的元素数量。

Equal_range()

它返回包含容器所有项目和与k比较的键的范围的边界。

Find()

给出指向元素空值的迭代器。

Position ()

它确定无序映射容器的容器是否为空。

Erase()

可以使用erase()函数删除无序映射容器中的元素。

尽管 C++11 库也提供了用于查看内部桶大小、桶计数、使用的哈希函数和各种哈希策略的函数,但它们在实际应用中用处不大。使用迭代器,我们可以遍历无序映射中的每个元素。

示例

输出

Retrieved the value of pi

Lambda value cannot retrieved

The entire elements :
E 2.718
The value ofloge 1
The value oflog10 2.302
The value of root2 1.414
The value ofroot3 1.732
The value of pi 3.14
Two 2
Three 3
One 1

示例

输出

(programs, 1)
(learn, 1)
(questions, 1)
(t, 1)
(points, 1)
(java, 1)

下一个主题C++ 初学者书籍