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

news2024/12/25 9:08:28
定义于头文件 <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>::count

size_type count( const Key& key ) const;

(1)

template< class K >
size_type count( const K& x ) const;

(2)(C++14 起)

返回拥有关键比较等价于指定参数的元素数。

1) 返回拥有关键 key 的元素数。

2) 返回拥有关键比较等价于值 x 的元素数。此重载仅若有限定 id Compare::is_transparent 合法且指代一个类型才参与重载决议。这允许调用此函数而不构造 Key 的实例。

参数

key-要计量元素数的关键值
x-要与关键比较的替用值

返回值

拥有比较等价于 keyx 的关键的元素数。

复杂度

与容器大小成对数,加上与找到的元素数成线性。

 

寻找带有特定键的元素

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

iterator find( const Key& key );

(1)

const_iterator find( const Key& key ) const;

(2)

template< class K > iterator find( const K& x );

(3)(C++14 起)

template< class K > const_iterator find( const K& x ) const;

(4)(C++14 起)

1,2) 寻找键等于 key 的的元素。若容器中有数个拥有键 key 的元素,则可能返回任意一者。

3,4) 寻找键比较等价于值 x 的元素。此重载仅若若有限定 id Compare::is_transparent 合法并且指代类型才参与重载决议。允许调用此函数而无需构造 Key 的实例。

参数

key-要搜索的元素键值
x-能通透地与键比较的任何类型值

返回值

指向键等于 key 的元素的迭代器。若找不到这种元素,则返回尾后(见 end() )迭代器。

复杂度

与容器大小成对数。

 

返回匹配特定键的元素范围

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

std::pair<iterator,iterator> equal_range( const Key& key );

(1)

std::pair<const_iterator,const_iterator> equal_range( const Key& key ) const;

(2)

template< class K >
std::pair<iterator,iterator> equal_range( const K& x );

(3)(C++14 起)

template< class K >
std::pair<const_iterator,const_iterator> equal_range( const K& x ) const;

(4)(C++14 起)

 返回容器中所有拥有给定关键的元素范围。范围以二个迭代器定义,一个指向首个不小于 key 的元素,另一个指向首个大于 key 的元素。首个迭代器可以换用 lower_bound() 获得,而第二迭代器可换用 upper_bound() 获得。

1,2) 比较关键与 key

3,4) 比较关键与值 x 。此重载仅若有限定 id Compare::is_transparent 合法且指代一个类型才参与重载决议。它们允许调用此函数而不构造 Key 的实例。

本节未完成
原因:解释为何更好

参数

key-要比较元素的关键值
x-能与 Key 比较的替用值

返回值

含一对定义所需范围的迭代器的 std::pair :第一个指向首个不小于 key 的元素,第二个指向首个大于 key 的元素。

若无元素不小于 key ,则将尾后(见 end() )迭代器作为第一元素返回。类似地,若无元素大于 key ,则将尾后迭代器作为第二元素返回。

因为 emplace 和无提示的 insert 始终在上界插入,相等范围中等价元素的顺序就是插入顺序,除非用有提示的 insertemplace_hint 在不同的位置插入元素。

(C++11 起)

复杂度

与容器大小成对数。

返回指向首个不小于给定键的元素的迭代器

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

iterator lower_bound( const Key& key );

(1)

const_iterator lower_bound( const Key& key ) const;

(1)

template< class K >
iterator lower_bound(const K& x);

(2)(C++14 起)

template< class K >
const_iterator lower_bound(const K& x) const;

(2)(C++14 起)

 1) 返回指向首个不小于 key 的元素的迭代器。

2) 返回指向首个比较不小于x 的元素的迭代器。此重载仅若有限定 id Compare::is_transparent 合法并指代一个类型才参与重载决议。它们允许调用此函数而无需构造 Key 的实例。

参数

key-要与元素比较的关键值
x-能与 Key 比较的替用值

返回值

指向首个不小于 key 的元素的迭代器。若找不到这种元素,则返回尾后迭代器(见 end() )。

复杂度

与容器大小成对数。

返回指向首个大于给定键的元素的迭代器

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

iterator upper_bound( const Key& key );

(1)

const_iterator upper_bound( const Key& key ) const;

(1)

template< class K >
iterator upper_bound( const K& x );

(2)(C++14 起)

template< class K >
const_iterator upper_bound( const K& x ) const;

(2)(C++14 起)

 1) 返回指向首个大于 key 的元素的迭代器。

2) 返回指向首个比较大于x 的元素的迭代器。此重载仅若有限定 id Compare::is_transparent 合法并指代一个类型才参与重载决议。这允许调用此函数而无需构造 Key 的实例。

参数

key-与元素比较的关键值
x-能与 Key 比较的替用值

返回值

指向首个大于 key 的元素的迭代器。若找不到这种元素,则返回尾后(见 end() )迭代器。

复杂度

与容器大小成对数。

调用示例

#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 < 6; index++)
    {
        //插入以给定的 args 原位构造的新元素到容器。
        multimap1.emplace(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;
    std::cout << std::endl;

    for (std::multimap<int, Cell>::const_iterator it = multimap1.cbegin(); it != multimap1.end(); it++)
    {
        std::cout << "multimap1 key ( " << it->first << " ) ";
        //返回拥有关键比较等价于指定参数的元素数。
        std::cout << "count :   " << multimap1.count(it->first);
        std::cout << std::endl;
    }
    std::cout << std::endl;

    for (std::multimap<int, Cell>::const_iterator it = multimap1.cbegin(); it != multimap1.end(); it++)
    {
        std::cout << "multimap1 find key ( " << it->first << " ) ";
        //1,2) 寻找键等于 key 的的元素。若容器中有数个拥有键 key 的元素,则可能返回任意一者。
        std::multimap<int, Cell>::const_iterator fit = multimap1.find(it->first);
        std::cout << "value :   " << fit->second;
        std::cout << std::endl;
    }
    std::cout << std::endl;

    for (std::multimap<int, Cell>::const_iterator it = multimap1.cbegin(); it != multimap1.end(); it++)
    {
        //返回容器中所有拥有给定关键的元素范围。
        //范围以二个迭代器定义,一个指向首个不小于 key 的元素,另一个指向首个大于 key 的元素。
        std::pair<std::multimap<int, Cell>::iterator, std::multimap<int, Cell>::iterator> pit =
            multimap1.equal_range(it->first);

        std::cout << "multimap1 equal_range key ( " << it->first << " ) ";
        std::copy(pit.first, pit.second, std::ostream_iterator<std::pair<const int, Cell>>(std::cout, " "));
        std::cout << std::endl;
    }
    std::cout << std::endl;

    for (std::multimap<int, Cell>::const_iterator it = multimap1.cbegin(); it != multimap1.end(); it++)
    {
        //1) 返回指向首个不小于 key 的元素的迭代器。
        std::multimap<int, Cell>::const_iterator lit = multimap1.lower_bound(it->first);
        std::cout << "multimap1 lower_bound key ( " << lit->first << " ) ";
        std::cout << "value :   " << lit->second;
        std::cout << std::endl;
    }
    std::cout << std::endl;

    for (std::multimap<int, Cell>::const_iterator it = multimap1.cbegin(); it != multimap1.end(); it++)
    {
        //1) 返回指向首个大于 key 的元素的迭代器。
        std::multimap<int, Cell>::const_iterator uit = multimap1.upper_bound(it->first);
        if (uit == multimap1.end())
        {
            continue;
        }
        std::cout << "multimap1 upper_bound key ( " << uit->first << " ) ";
        std::cout << "value :   " << uit->second;
        std::cout << std::endl;
    }

    return 0;
}

输出

 

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

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

相关文章

Compose Recomposer启动流程分析

初始组合流程开始的第一步就是创建 Recomposer 。 接着 Recomposer 又作为构造参数创建了 CompositionImpl 、 ComposerImpl &#xff0c;又在 AndroidComposeView#onAttachedToWindow() 触发 onViewTreeOwnersAvailable 回后&#xff0c;调用 composeInitial() 开启初始组合。…

java连接docker里面的hbase

原代码代码一直卡着报错如下&#xff1a;java.io.UncheckedI0Exception:org.apache.hadoop.hbase.client.RetriesExhaustedException: Cant get the location for replica 0at org.apache.hadoop.hbase.client.ResultScanner$1.hasNext(ResultScanner.java:55)at hbase.SelectS…

基于C++的考试系统

一、需求分析 ​ 设计一个简单的考试系统&#xff0c;可进行C与Java的考试&#xff0c;考生姓名、考生学号、C题目、Java题目、C答案&#xff0c;Java答案分别存入…/txt文件数据/路径下的StudentsName、StudentsNum、QuestionC&#xff0c;QuestionJ、AnswerC、AnswerJtxt文件…

【一般人不会告诉你】比肩chatgtp的5款AI网站

话不多说&#xff0c;直接上连接 1. Dall-E: https://labs.openai.com/ 2. Codeformer: https://shangchenzhou.com/projects/Co... 3. Playground AI: https://playgroundai.com/ 4. Clip Drop: https://clipdrop.co/relight 5. Astria: https://www.strmr.com/examples …

Apache服务关闭攻防场景模拟实验

一、场景概述 攻击机攻击已知的公共Apache web服务器&#xff0c;导致Apache服务关闭&#xff0c;web网站无法访问。攻击者利用安全外壳 (SSH) 暴力攻击访问服务器&#xff0c;并上传后门文件和脚本&#xff0c;每分钟将服务器的用户名称和密码发送给攻击机以保持对服务器的访…

【分享】如何通过集简云将ChatGPT人工智能接入到我们的抖音中?

ChatGPT是一款非常强大的人工智能产品&#xff0c;可以有创造性的回复和创作文字&#xff0c;图片&#xff0c;适用于很多办公场景。这篇文章将介绍如何将ChatGPT接入到我们的抖音中。 在集简云中的ChatGPT应用 目前集简云提供了两个ChatGPT应用: OpenAI(ChatGPT&#xff09;内…

什么是同步整流和异步整流

在设计降压型DCDC电路的时候&#xff0c;经常会听到同步整流&#xff08;synchronous&#xff09;和异步整流&#xff08;asynchronous&#xff09;。那么什么是同步整流&#xff0c;什么是异步整流呢从这两种电路的拓扑来看&#xff0c;异步整流型外围有一个续流二极管&#x…

07 OpenCV各类滤波

1 均值滤波 均值滤波器是一种基本的线性滤波器&#xff0c;常用于图像处理中的平滑操作。在 OpenCV 中&#xff0c;可以使用cv2.blur()函数或cv2.boxFilter()函数进行均值滤波操作。 均值滤波器的原理是将每个像素的灰度值替换为其周围像素灰度值的平均值。其核心思想是去除图…

Android App开发基础

文章目录一 App的开发特点1.1 App的运行环境1.2 App开发语言1.3 java语言开发1.4 Kotlin语言开发1.5 XML1.6 App连接的数据库二 App的工程结构2.1 App工程目录结构2.2 构建工具Grade2.3 编译配置文件build.gradle2.4 运行配置文件AndroidManifest.xml2.4.1 application2.4.2 ac…

科研试剂供应Pyrene-PEG3-Propargyl,芘甲酰胺-三聚乙二醇-丙炔

Pyrene-PEG3-Propargyl&#xff0c;Propargyl-PEG3-Pyrene&#xff0c;芘甲酰胺-三聚乙二醇-丙炔&#xff0c;芘甲酰胺三聚乙二醇丙炔反应特点&#xff1a;Pyrene-PEG3-Propargyl属于炔基点击试剂&#xff0c;点击化学的概念对化学合成领域有很大的贡献&#xff0c;在药 物开发…

nvdiffrast

nvidiffrast主页https://arxiv.org/pdf/2011.03277.pdfhttps://github.com/NVlabs/nvdiffrast CSC2547 Differentiable Rendering A Survey https://www.youtube.com/watch?v7LU0KcnSTc4 DR https://blog.qarnot.com/an-overview-of-differentiable-rendering/ 知乎 https:…

找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。

测试工程师招了快一个月了&#xff0c;实在招不到合适的&#xff0c;已经在被解雇的边缘了。。。” 初级测试工程师非常多&#xff0c;但真正掌握测试思维、能力强的优秀测试太少了&#xff01; 据我所知&#xff0c; 当下的测试人员不少状态都是这样的&#xff1a; 在工作中…

设计模式C++实现18:迭代器模式(Iterator)

意图&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。 上下文&#xff1a;集合对象内部结构常常变化各异。对于这些集合对象&#xff0c;能否在不暴露其内部结构的同时&#xff0c;让外部Client透明地访问其中包含的元素…

动态规划(楼梯和股票问题)

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录动态规划&…

抓包工具Charles(一)-下载安装与设置

无论是在测试、开发工作中&#xff0c;抓包都是很重要、很常用的技能。Charles作为一款抓包工具&#xff0c;能够满足大部分的工作需求。 文章目录一、下载地址二、安装三、安装根证书&#xff08;电脑&#xff09;四、设置五、抓包附录&#xff1a;[零基础入门接口功能测试教程…

<JVM上篇:内存与垃圾回收篇>10 - StringTable

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录10.1. String 的基本特性10.1.1. String 在 jdk9 中存储结构变更MotivationDescription10.1.2. String 的基本特性10.2. String 的内…

ARMv8 同步和信号量(Synchronization and semaphores)简介

目录 1&#xff0c;Load-Exclusive/Store-Exclusive 概述 2&#xff0c;独占式访问指令与非共享内存( Exclusive access instructions and Non-shareable memory locations) 3&#xff0c;独占式访问指令与共享内存( Exclusive access instructions and shareable memory lo…

文华财经期货波段趋势K线结构主图阶梯公式源码,极品多空红绿轨道指标公式

期货指标公式是通过数学逻辑角度计算而来&#xff0c;仅是期货分析环节中的一个辅助工具。期货市场具有不确定性和不可预测性的&#xff0c;请正常对待和使用指标公式! 第一步&#xff1a;判大势 所谓判大势&#xff0c;就是判断当前行情趋势&#xff0c;是入场前的必备步骤。…

中汽协确认参加2023EVH新能源动力总成年会

演讲主题&#xff1a;中国汽车工业经济运行情况 演讲大纲&#xff1a; 对中国汽车工业近期发展态势进行分析2023年汽车行业预测 陈士华 现任中国汽车工业协会副秘书长&#xff0c;兼任中国汽车工业经济技术信息研究所有限公司总经理 1999年3月至今&#xff0c;就职于中国汽…

接口自动化测试框架(Java 实现)

需求分析 需求点需求分析通过 yaml 配置接口操作和用例后续新增接口和测试用例只需要编写 yaml 文件即可实现。可以支持接口间的参数传递具有参数依赖的接口可以进行变量的抽取和参数赋值。支持全局、用例维度的变量存储比如时间截命名法中要用到的时间截后缀。支持用例软断言…