c++11 标准模板(STL)(std::unordered_multimap)(十三)

news2024/11/18 6:04:26
定义于头文件 <unordered_map>
template<

    class Key,
    class T,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator< std::pair<const Key, T> >

> class unordered_multimap;
(1)(C++11 起)
namespace pmr {

    template <class Key, class T,
              class Hash = std::hash<Key>,
              class Pred = std::equal_to<Key>>
    using unordered_multimap = std::unordered_multimap<Key, T, Hash, Pred,
                                   std::pmr::polymorphic_allocator<std::pair<const Key,T>>>;

}
(2)(C++17 起)

 unordered_multimap 是无序关联容器,支持等价的关键(一个 unordered_multimap 可含有每个关键值的多个副本)和将关键与另一类型的值关联。 unordered_multimap 类支持向前迭代器。搜索、插入和移除拥有平均常数时间复杂度。

元素在内部不以任何特定顺序排序,而是组织到桶中。元素被放进哪个桶完全依赖于其关键的哈希。这允许到单独元素的快速访问,因为哈希一旦计算,则它指代元素被放进的准确的桶。

不要求此容器的迭代顺序稳定(故例如 std::equal 不能用于比较二个 std::unordered_multimap ),除了关键比较等价(以 key_eq() 为比较器比较相等)的每组元素在迭代顺序中组成相接的子范围,它亦可用 equal_range() 访问。

哈希策略

返回每个桶的平均元素数量

std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>::load_factor

float load_factor() const;

(C++11 起)

返回每个桶元素的平均数,即 size() 除以 bucket_count() 。

参数

(无)

返回值

每个桶元素的平均数。

复杂度

常数。

管理每个桶的平均元素数量的最大值

std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>::max_load_factor

管理最大加载因子(每个桶的平均元素数)。若加载因子超出此阈值,则容器自动增加桶数。

1) 返回最大加载因子。

2) 设置最大加载因子为 ml

参数

ml-新设置的最大加载因子

返回值

1) 当前最大加载因子。

2) 无。

复杂度

常数

为至少为指定数量的桶预留存储空间。

这会重新生成哈希表。

std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>::rehash

void rehash( size_type count );

(C++11 起)

设置桶数为 count 并重哈希容器,即考虑桶总数已改变,再把元素放到适当的桶中。若新的桶数使加载因子大于最大加载因子( count < size() / max_load_factor() ),则新桶数至少为 size() / max_load_factor() 。

参数

count-新的桶数

返回值

(无)

复杂度

平均与容器大小成线性,最坏情况成平方。

注意

rehash(0) 可用于强制无条件的重哈希,例如在通过临时增加 max_load_factor() 暂停自动重哈希之后。

为至少为指定数量的元素预留存储空间。

这会重新生成哈希表。

std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>::reserve

void reserve( size_type count );

(C++11 起)

设置桶数为适应至少 count 个元素,而不超出最大加载因子所需的数,并重哈希容器,即考虑桶数已更改后将元素放进适合的桶。等效地调用 rehash(std::ceil(count / max_load_factor())) 。

参数

count-容器的新容量

返回值

(无)

复杂度

平均情况与容器大小成线性,最坏情况成平方。

调用示例

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <unordered_map>
#include <time.h>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell() = default;
    Cell(int a, int b): x(a), y(b) {}

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator +(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator *(const Cell &cell)
    {
        x *= cell.x;
        y *= cell.y;
        return *this;
    }

    Cell &operator ++()
    {
        x += 1;
        y += 1;
        return *this;
    }


    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }

    bool operator >(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y > cell.y;
        }
        else
        {
            return x > cell.x;
        }
    }

    bool operator ==(const Cell &cell) const
    {
        return x == cell.x && y == cell.y;
    }
};

struct myCompare
{
    bool operator()(const int &a, const int &b)
    {
        return a < b;
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

std::ostream &operator<<(std::ostream &os, const std::pair<Cell, string> &pCell)
{
    os << pCell.first << "-" << pCell.second;
    return os;
}

struct CHash
{
    size_t operator()(const Cell& cell) const
    {
        size_t thash = std::hash<int>()(cell.x) | std::hash<int>()(cell.y);
//        std::cout << "CHash: " << thash << std::endl;
        return thash;
    }
};

struct CEqual
{
    bool operator()(const Cell &a, const Cell &b) const
    {
        return a.x == b.x && a.y == b.y;
    }
};

int main()
{
    auto generate = []()
    {
        int n = std::rand() % 10 + 110;
        Cell cell{n, n};
        return std::pair<Cell, string>(cell, std::to_string(n));
    };

    std::unordered_multimap<Cell, string, CHash, CEqual> unordered_multimap1;
    while (unordered_multimap1.size() < 6)
    {
        //返回每个桶元素的平均数,即 size() 除以 bucket_count() 。
        std::cout << "unordered_multimap1 load_factor :  " << unordered_multimap1.size()
                  << " / " << unordered_multimap1.bucket_count() << " = "
                  << unordered_multimap1.load_factor() << std::endl;

        //6) 插入来自 initializer_list ilist 的元素。
        unordered_multimap1.insert({generate()});
    }

    std::cout << "unordered_multimap1:   ";
    std::copy(unordered_multimap1.begin(), unordered_multimap1.end(),
              std::ostream_iterator<pair<Cell, string>>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;


    std::unordered_multimap<Cell, string, CHash, CEqual> unordered_multimap2;
    size_t index = 1;
    while (unordered_multimap2.size() < 3)
    {
        //管理最大加载因子(每个桶的平均元素数)。若加载因子超出此阈值,则容器自动增加桶数。
        //1) 返回最大加载因子。
        std::cout << "unordered_multimap2 max_load_factor    :  "
                  << unordered_multimap2.max_load_factor() << std::endl;

        //2) 设置最大加载因子为 ml 。
        unordered_multimap2.max_load_factor(index);
        std::cout << "unordered_multimap2 max_load_factor(" << index << ") :  "
                  << unordered_multimap2.max_load_factor() << std::endl;

        //返回每个桶元素的平均数,即 size() 除以 bucket_count() 。
        std::cout << "unordered_multimap2 load_factor        :  " << unordered_multimap2.size()
                  << " / " << unordered_multimap2.bucket_count() << " = "
                  << unordered_multimap2.load_factor() << std::endl;

        //6) 插入来自 initializer_list ilist 的元素。
        unordered_multimap2.insert({generate()});
        index++;
    }
    std::cout << std::endl;


    std::unordered_multimap<Cell, string, CHash, CEqual> unordered_multimap3;
    index = 1;
    while (unordered_multimap3.size() < 3)
    {
        unordered_multimap3.max_load_factor(index);
        std::cout << "unordered_multimap3 max_load_factor(" << index << ") :  "
                  << unordered_multimap3.max_load_factor() << std::endl;

        //1) 返回最大加载因子。
        std::cout << "unordered_multimap3 max_load_factor    :  "
                  << unordered_multimap3.max_load_factor() << std::endl;

        //设置桶数为 count 并重哈希容器,即考虑桶总数已改变,再把元素放到适当的桶中
        unordered_multimap3.rehash(index);
        std::cout << "unordered_multimap3 rehash(" << index << ") " << std::endl;

        //返回每个桶元素的平均数,即 size() 除以 bucket_count() 。
        std::cout << "unordered_multimap3 load_factor        :  " << unordered_multimap3.size()
                  << " / " << unordered_multimap3.bucket_count() << " = "
                  << unordered_multimap3.load_factor() << std::endl;

        //6) 插入来自 initializer_list ilist 的元素。
        unordered_multimap3.insert({generate()});
        index++;
    }
    std::cout << std::endl;


    std::unordered_multimap<Cell, string, CHash, CEqual> unordered_multimap4;
    index = 1;
    while (unordered_multimap4.size() < 3)
    {
        unordered_multimap4.max_load_factor(index);
        std::cout << "unordered_multimap4 max_load_factor(" << index << ") :  "
                  << unordered_multimap4.max_load_factor() << std::endl;

        //1) 返回最大加载因子。
        std::cout << "unordered_multimap4 max_load_factor    :  "
                  << unordered_multimap4.max_load_factor() << std::endl;

        //设置桶数为 count 并重哈希容器,即考虑桶总数已改变,再把元素放到适当的桶中
        unordered_multimap4.reserve(index);
        std::cout << "unordered_multimap4 reserve(" << index << ") " << std::endl;

        //返回每个桶元素的平均数,即 size() 除以 bucket_count() 。
        std::cout << "unordered_multimap4 load_factor        :  " << unordered_multimap3.size()
                  << " / " << unordered_multimap4.bucket_count() << " = "
                  << unordered_multimap4.load_factor() << std::endl;

        //6) 插入来自 initializer_list ilist 的元素。
        unordered_multimap4.insert({generate()});
        index++;
    }
    return 0;
}

输出

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交互式电子沙盘数字沙盘大数据系统开发第8课

交互式电子沙盘数字沙盘大数据系统开发第8课 这次我们完成的功能为拖动一个外部的UI对象到球球上&#xff1a; private void Button_PreviewMouseMove(object sender, MouseEventArgs e) { if(e.LeftButton MouseButtonState.Pressed) DragDr…

Vue简易便签实现

Vue简易便签实现 html部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…

ChatGPT这么强,你该怎么办?

总编说&#xff1a;《生命3.0》给未来选择工作的人提出的建议显得更加重要。泰格玛克认为&#xff0c;未来选择工作前需要询问三个问题&#xff1a;是否需要与人打交道&#xff0c;运用社交智慧&#xff1f;是否需要创造力&#xff0c;解决复杂问题&#xff1f;是否需要在不确定…

leetcode1306.跳跃游戏

跳跃游戏 -这里有一个非负整数数组 arr&#xff0c;你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。 注意&#xff0c;不管是什么情况下&#xff…

不会吧?该不会还有企业没实现员工赋能吧!要我说,选低代码就对了!

员工作为企业的重要生产力要素&#xff0c;员工赋能一直是企业经营者重点关注的领域。 在大部分企业经营实践中&#xff0c;员工赋能由人力资源部门负责&#xff0c;赋能的主要形式是集中培训&#xff0c;其结果往往是业务繁忙时&#xff0c;人力组织难度大、业务部门参与意愿低…

深度剖析JVM三个面试常考知识点

目录 &#x1f433;今日良言:只要你足够努力,生命都会庇佑你 &#x1f407;一、JVM内存区域划分 &#x1f407;二、类加载过程 &#x1f407;三、垃圾回收机制(GC) &#x1f433;今日良言:只要你足够努力,生命都会庇佑你 &#x1f407;一、JVM内存区域划分 先来了解一下什…

MySql的sql_mode

文章目录简介查看命令配置文件设置命令配置文件常用的模式ONLY_FULL_GROUP_BYNO_AUTO_VALUE_ON_ZEROSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTIONPIPES_AS_CONCATANSI_QUOTES专栏目录请点击 简介 他是…

【通过Cpython3.9源码看看列表到底是咋回事】

列表结构 typedef struct {PyObject_VAR_HEAD/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */PyObject **ob_item;/* ob_item contains space for allocated elements. The number* currently in use is ob_size.* Invariants:* 0 < ob_siz…

vulnhub DC:3.2渗透笔记

kali ip :192.168.20.130 靶机下载地址:https://www.vulnhub.com/entry/dc-32,312/ 信息收集 扫描靶机ip以及开放端口 开放了80端口访问一下 Welcome to DC-3. This time, there is only one flag, one entry point and no clues. To get the flag, youll obviously have …

【Java版oj】day29求正数数组的最小不可组成和、有假币

目录 一、求正数数组的最小不可组成和 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、有假币 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码…

三、用户与权限管理

五、角色管理 1、角色的理解 引入角色的目的时方便管理相同权限的用户。只需要给相同权限的用户分配角色即可&#xff0c;而不需要分配具体的权限 2、创建角色 创建角色使用 CREATE ROLE 语句&#xff0c;语法如下&#xff1a; CREATE ROLE role_name[host_name] [,role_…

干货分享 | 常用车载总线CAN、CANFD、LIN、FlexRay 和 Ethernet概述

随着现代汽车的电子化程度越来越高&#xff0c;汽车总线系统也变得越来越复杂。汽车总线测试是一项重要的任务&#xff0c;它有助于确定车辆电子系统中的问题&#xff0c;并保障车辆的安全和可靠性。本文将介绍五种常见的汽车总线系统和相关的测试工具。 CAN总线 …… 控制器…

传输线的物理基础(八):用近似值和二维场计算特性阻抗

设计一个特定的目标特性阻抗实际上是调整线宽、电介质厚度和介电常数的问题。如果我们知道传输线的长度和导体周围材料的介电常数&#xff0c;并且我们可以计算出特征阻抗&#xff0c;我们就可以使用上面的关系来计算所有其他参数。 当然&#xff0c;每一种不同类型的横截面几…

kaggle竞赛 - Stable Diffusion - Image to Prompts

演绎提示&#xff0c;生成我们的“高度详细&#xff0c;锐利的焦点&#xff0c;插图&#xff0c;宏伟&#xff0c;史诗”图像的3d渲染 1.比赛目标 这个竞赛的目标不是从文本提示生成图像&#xff0c;而是创建一个模型&#xff0c;可以在给定生成图像的情况下预测文本提示&…

曲线平滑算法:三次Hermite曲线生成

目录 1.三次Hermite曲线的参数方程 2. 三次Hermite曲线的绘制 Hermite曲线是通过给定曲线的两个端点的位置矢量、以及两个端点处的切线矢量、来描述曲线的&#xff0c;如图1所示。这里先对Hermite曲线进行数学公式推导&#xff0c;然后讲述如何绘制Hermite曲线。&#xff08;这…

【Ansys】什么软件模块是DS,它和workbench、mechanical的区别在哪里?

一、DesignSpace和workbench 早期的Workbench称之为DesignSpace&#xff0c;更偏向于建模。 现在DS是license的一种&#xff0c;而分析的模块在11中称之为Simulation&#xff08;Design Simulation&#xff09;&#xff0c;在12中改名为Mechanical。 所以&#xff0c;你可以…

SpringBoot整合RabbitMQ(六种工作模式介绍)

介绍 RabbitMQ是一种消息中间件&#xff0c;用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbitMQ配置的转发机制接收服务端发来的消息。 RabbitMQ依据指定的转发规则进行消息的转发、缓冲和持久化操作&#xff0c;主要用在多服务器间或…

Unity开发数字化看板-通用的设备运动同步

通用的设备运动同步 通过获取实时采集运动位置&#xff0c;发送到unity程序中&#xff0c;通过比例运算&#xff0c;转换成模型的运动位置&#xff0c;实现虚实同步。 在工业设备中&#xff0c;复杂的运动进行分析、分解&#xff0c;最本质的的运动就是平移和转动&#xff0c…

美团到店暑期实习Java一面

目录1.rabbitmq如何避免消息丢失 &#xff08;三个阶段&#xff09;2.如何保证消息的顺序性3.如何保证消息不被重复消费4.缓存与数据库的不一致性5.redis的过期策略和内存淘汰策略6.简单说下LRU的实现7.用原生redis实现分布式锁&#xff0c;锁误删的情况8.锁续期如何去考量9.缓…

MySQL-----库的操作

文章目录前言一、创建数据库二、创建数据库实例三、字符集和校验规则1.查看系统默认字符集以及校验规则.2.查看数据库支持的字符集3.查看数据库支持的字符集校验规则4.校验规则对数据库的影响四、操纵数据库1.查看数据库2.显示创建语句4.修改数据库5.删除数据库6.备份和恢复6.1…