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

news2024/12/24 21:30:08
定义于头文件 <map>
template<

    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >

> class multimap;
(1)
namespace pmr {

    template <class Key, class T, class Compare = std::less<Key>>
    using multimap = std::multimap<Key, T, Compare,
                                  std::pmr::polymorphic_allocator<std::pair<const Key,T>>>;

}
(2)(C++17 起)

multimap 是关联容器,含有关键-值 pair 的已排序列表,同时容许多个入口拥有同一关键。按照应用到关键的比较函数 Compare 排序。搜索、插入和移除操作拥有对数复杂度。

拥有等价关键的关键-值 pair 的顺序就是插入顺序,且不会更改。(C++11 起)

凡在标准库使用比较 (Compare) 概念出,都用描述于比较 (Compare) 上的等价关系确定等价性。不精确地说,若二个对象 ab 互不小于对方: !comp(a, b) && !comp(b, a) ,则认为它们等价。


成员函数

赋值给容器

std::multimap<Key,T,Compare,Allocator>::operator=

multimap& operator=( const multimap& other );

(1)

multimap& operator=( multimap&& other );

(2)(C++11 起)
(C++17 前)

multimap& operator=( multimap&& other ) noexcept(/* see below */);

(C++17 起)

multimap& operator=( std::initializer_list<value_type> ilist );

(3)(C++11 起)

替换容器内容。

1) 复制赋值运算符。以 other 的副本替换内容。若 std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value 为 true ,则以源分配器的副本替换目标分配器。若源分配器与目标分配器不比较相等,则用目标( *this )分配器销毁内存,然后在复制元素前用 other 的分配器分配。 (C++11 起).、

2) 移动赋值运算符。用移动语义以 other 的内容替换内容(即从 other 移动 other 中的数据到此容器)。之后 other 在合法但未指定的状态。若 std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value 为 true ,则用源分配器的副本替换目标分配器。若它为 false 且源与目标分配器不比较相等,则目标不能取走源内存的所有权,而必须单独移动赋值逐个元素,用自己的分配器按需分配额外的内存。任何情况下,原先在 *this 中的元素要么被销毁,要么以逐元素移动赋值替换。

3) 以 initializer_list ilist 所标识者替换内容。

参数

other-用作数据源的另一容器
ilist-用作数据源的 initializer_list

返回值

*this

复杂度

1) 与 *thisother 的大小成线性。

2) 与 *this 的大小成线性,除非分配器不比较相等且不传播,该情况下与 *thisother 的大小成线性。

3) 通常为 O(NlogN) ,其中 N 为 size() + ilist.size() 。若 ilist 相对于 value_comp() 已排序则为线性。

异常

2)noexcept 规定:  

noexcept(std::allocator_traits<Allocator>::is_always_equal::value
&& std::is_nothrow_move_assignable<Compare>::value)

(C++17 起)

注意

容器移动赋值(重载 (2) )后,除非不兼容的分配器强制逐元素赋值,否则指向 other 的引用、指针和迭代器(除了尾迭代器)都保持合法,不过指代的元素现在在 *this 中。当前标准通过 §23.2.1[container.requirements.general]/12 中的总括陈述保证这点,而 LWG 2321 下正在考虑更直接的保证。

返回相关的分配器

std::multimap<Key,T,Compare,Allocator>::get_allocator

allocator_type get_allocator() const;

返回与容器关联的分配器。

参数

(无)

返回值

关联的分配器。

复杂度

常数。

 

调用示例

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <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<const int, Cell> &pCell)
{
    os << pCell.first << "-" << pCell.second;
    return os;
}

int main()
{
    std::cout << std::boolalpha;

    std::mt19937 g{std::random_device{}()};
    srand((unsigned)time(NULL));

    auto genKey = []()
    {
        return std::rand() % 10 + 100;
    };

    auto generate = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    std::multimap<int, Cell> multimap1;
    for (size_t index = 0; index < 5; index++)
    {
        multimap1.insert({genKey(), generate()});
    }
    std::cout << "multimap1:    ";
    std::copy(multimap1.begin(), multimap1.end(), std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));
    std::cout << std::endl;


    //1) 复制赋值运算符。以 other 的副本替换内容。
    std::multimap<int, Cell> multimap2 = multimap1;
    std::cout << "multimap2:    ";
    std::copy(multimap2.begin(), multimap2.end(), std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));
    std::cout << std::endl;


    //2) 移动赋值运算符。用移动语义以 other 的内容替换内容
    std::multimap<int, Cell> multimap3 = std::move(multimap1);
    std::cout << "multimap3:    ";
    std::copy(multimap3.begin(), multimap3.end(), std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));
    std::cout << std::endl;


    //3) 以 initializer_list ilist 所标识者替换内容。
    std::multimap<int, Cell, std::greater<int>> multimap4({{genKey(), generate()}, {genKey(), generate()},
        {genKey(), generate()}, {genKey(), generate()}, {genKey(), generate()}});
    std::cout << "multimap4:    ";
    std::copy(multimap4.begin(), multimap4.end(), std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));
    std::cout << std::endl;

    return 0;
}

输出

 

 

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

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

相关文章

SCI论文阅读-使用基于图像的机器学习模型对FTIR光谱进行功能组识别

期刊&#xff1a; Analytical Chemistry中科院最新分区&#xff08;2022年12月最新版&#xff09;&#xff1a;1区(TOP)影响因子&#xff08;2021-2022&#xff09;&#xff1a;8.008第一作者&#xff1a;Abigail A. Enders通讯作者&#xff1a;Heather C. Allen 原文链接&…

自己家用的电脑可以架设游戏吗

自己家用的电脑可以架设游戏吗家用电脑怎么用来做服务器呢&#xff1f;我是艾西&#xff0c;今天我跟大家详细的说家用电脑可以当服务器使用吗&#xff1f;咱们先把家用电脑不足的点列出来就清楚了一、外网端口映射以前的宽带大多数是adsl拨号&#xff0c;再搭配一个TP路由器&a…

SQL语句训练

好文推荐&#xff1a; 21个MySQL表设计的经验准则 后端程序员必备&#xff1a;书写高质量SQL的30条建议 我们为什么要分库分表&#xff1f; 从0.742秒到0.006秒&#xff0c;MySQL百万数据深分页优化实战 2020年MySQL数据库50面试题目含答案 MyBatis 表连接查询写法|三种对…

深度学习实战(11):使用多层感知器分类器对手写数字进行分类

使用多层感知器分类器对手写数字进行分类 1.简介 1.1 什么是多层感知器&#xff08;MLP&#xff09;&#xff1f; MLP 是一种监督机器学习 (ML) 算法&#xff0c;属于前馈人工神经网络 [1] 类。该算法本质上是在数据上进行训练以学习函数。给定一组特征和一个目标变量&#x…

2021年新公开工业控制系统严重漏洞汇总

声明 本文是学习ITOT一体化工业信息安全态势报告&#xff08;2019&#xff09;. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 工业互联网安全威胁 2021年新公开工业控制系统严重漏洞 缓冲区溢出漏洞 缓冲区溢出&#xff08;buffer overflow&…

什么是自动化测试?自动化测试现状怎么样?

什么是自动化测试&#xff1a;其实自动化测试&#xff0c;就是让我们写一段程序去测试另一段程序是否正常的过程&#xff0c;自动化测试可以更加省力的替代一部分的手动操作。 现在自动化测试的现状&#xff0c;也是所有学习者关心的&#xff0c;但现在国内公司主要是以功能测…

算法设计 - 前缀和 差分数列

一维数组前缀和的概念 前缀和的概念很简单&#xff0c;我们用一维数组的前缀和来举例&#xff0c;有如下一维数组&#xff1a; arr [1, 2, 3, 4, 5] 该数组的前缀和数组如下 preSum [1, 3, 6, 10, 15] 关系如下&#xff1a; preSum[0] arr[0]preSum[1] arr[0] arr[1]pre…

Codeforces Round #851 (Div. 2) A — C

Codeforces Round #851 A. One and Two 题目描述 给定一个序列a中的每个元素都是1或2。找出整数k是否存在&#xff0c;以满足以题目所给条件。 题目分析 1对乘积没有贡献&#xff0c;只需要注意2的个数即可&#xff0c;偶数个2即可满足条件&#xff0c;记录第cnt/2个2的位…

集成nanocaptcha库生成登录验证码

背景 需要实现一个验证码登录的功能需求。这个需求挺简单的&#xff0c;主要实现验证码图片生成给前端&#xff0c;然后&#xff0c;在登录接口比对验证码即可。刚拿到这个需求&#xff0c;好久没有搞过登录这一块了&#xff0c;所以&#xff0c;查了一下相关验证码的知识。下…

cv2--特征点特征提取(Sift,Orb,Surf)

cv2–特征点特征提取&#xff08;Sift&#xff0c;Orb&#xff0c;Surf&#xff09; 文章目录cv2--特征点特征提取&#xff08;Sift&#xff0c;Orb&#xff0c;Surf&#xff09;1. 关键点和关键点描述子2. Sift2.1 检测的步骤2.2 同时计算关键点kp和描述子des3. Surf4. Orb5. …

61 UseSerialGc的新生代回收调试

前言 呵呵 很久之前看到这样的两篇文章 [讨论] HotSpot VM Serial GC的一个问题 新生代回收调试的一些心得 在第一篇帖子中 R大 详细的讲述了 cheney 算法, 以及自己编写的 cheney 算法, 以及 DefNewGeneration 的具体的一些细节, 以及 和现有的例子的对比 另外还有一些…

leaflet 加载topojson数据,显示图形(代码示例047)

第047个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载topojson文件,将图形显示在地图上。TopoJSON文件格式是geoJSON的一种扩展,它可以对地理空间拓扑进行编码。TopoJSON文件包含数据属性和地理空间的属性。 直接复制下面的 vue+openlayers源代码,操作…

C语言入门(什么是C语言,C语言的编程机制以及一些基础计算机概念)

目录 一.什么是C语言 1.面向对象&#xff1a; 2.面向过程&#xff1a; 二.C语言特点 三.C语言开发时间 四.环境搭建 1.代码编辑器 2.C编译器 五.C语言标准 六.计算机补充知识 1.计算机构成 2.CPU工作 3.编译器 七.编写程序步骤 八.源文件&#xff0c;目标文件&a…

SpringBoot 三大开发工具,你都用过么?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

Sentinel服务熔断功能(sentinel整合ribbon+openFeign+fallback)

目录 1、Sentinel服务熔断功能 一、Ribbon系列 &#xff08;一&#xff09;提供者9003/9004 &#xff08;二&#xff09;消费者84 二、OpenFeign系列 三、熔断框架比较 2、规则持久化 1、Sentinel服务熔断功能 一、Ribbon系列 &#xff08;一&#xff09;提供者9003/9004 …

DAMA数据管理知识体系指南之元数据管理

第11章 元数据管理 11.1简介 按照通常的说法&#xff0c;元数据的定义是“关于数据的数据”&#xff0c;但是其确切含义是什么&#xff1f;元数据与数据的关系就像数据与自然界的关系。数据反映了真实世界的交易、事件、对象和关系&#xff0c;而元数据则反映了数据的交易、事…

技术分享|终端安全防护|ChatGPT会创造出超级恶意软件吗?

ChatGPT是一个强大的人工智能聊天机器人&#xff0c;它使用大量的数据收集和自然语言处理与用户“交谈”&#xff0c;感觉像是和正常的人类对话。它的易用性和相对较高的准确性让用户可以利用它做任何事情&#xff0c;从解决复杂的数学问题&#xff0c;到写论文&#xff0c;创建…

【Linux】操作系统与进程的概念

目录 冯诺依曼体系 注意 为什么CPU不直接访问输入或输出设备&#xff1f; 跨主机间数据的传递 操作系统 管理 进程 描述进程 进程的查看和终止 bash 通过系统调用创建子进程 fork的辨析 冯诺依曼体系 &#x1f956;冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将…

(超详细)Navicat的安装和激活,亲测有效

步骤一&#xff1a;准备安装包 下载Navicat&#xff0c;我用的v15最好一致&#xff08;私信可以发你安装包和注册码&#xff09;步骤二&#xff1a;关闭杀毒软件&#xff0c;然后需要断掉网络&#xff08;一定断网&#xff09; 步骤三&#xff1a;一路next安装&#xff0c;安装…

nodejs如何实现Digest摘要认证?

文章目录1.前言2. 原理3. 过程4. node实现摘要认证5. 前端如何Digest摘要登录认证&#xff08;下面是海康的设备代码&#xff09;1.前言 根据项目需求&#xff0c;海康设备ISAPI协议需要摘要认证&#xff0c;那么什么是摘要认证&#xff1f;估计不少搞到几年的前端连摘要认证都…