首页 > 其他分享 >115.STL中的multimap

115.STL中的multimap

时间:2023-07-23 17:00:11浏览次数:34  
标签:容器 multimap map STL 115 键值 key pair

115.STL中的multimap

1.multimap的基本性质

multimap容器是和map容器相似的关联式容器,所谓“相似”,是指multimap容器具有和map容器相同的特性,即multimap容器也存储pair<const K, T>类型的键值对(其中K表示键的类型,T表示值的类型),其中各个键值对的键的值不能被修改;并且,该容器也会自行根据键的大小对所存储的所有键值对做排序操作。
multimap容器和map容器的区别在于,multimap容器中可以同时存储多个键相同的键值对。
multimap容器提供的成员方法,map容器都有提供,并且它们的用法是相同的。详细的用法请参照map的用法及实例详解。本文只是给出了所有在multimap中的成员函数及其实现功能,具体的实例及代码请参照map容器。

2.STL——multimap容器的用法

实现multimap容器的类模板也定义在<map>头文件,并位于std命名空间中,故使用multimap容器前,应该引入头文件:

#include<map>
using namespace std;

第二行代码不是必须的,但若不用,则程序中在使用multimap容器时需要手动注明std命名空间。
multimap容器的类模板定义如下:

template < class Key,                                   // 指定键(key)的类型
           class T,                                     // 指定值(value)的类型
           class Compare = less<Key>,                   // 指定排序规则
           class Alloc = allocator<pair<const Key,T> >  // 指定分配器对象的类型
           > class multimap;

和map容器一样,其中后2个参数都设有默认值,大多数时候只需设置前2个参数的值,有时候会用到第3个参数,最后一个参数几乎不会用到。

3.multimap容器的创建与初始化

multimap类模板内部提供多个构造函数,创建multimap容器的方式可以总结为以下5种。

3.1默认构造函数,创建一个空的multimap容器。

std::multimap <std::K, std::T> multimapname;

其中K和T分别为multimap容器中键值对的键和值的类型。另外,如果程序种已经默认指定了std命名空间,则这里可以省略std::,以下同理,不再赘述。

#include<iostream>
#include<map>
#include<string>
using namespace std;

int main()
{
    multimap<string, int> mymultimap;
    cout << mymultimap.size() << endl; //0
    
    return 0;

}

3.2在创建multimap容器的同时,也可以进行初始化。

multimap<string, int> mymultimap{{"penny",1},{"leonard",2},{"sheldon",3}};

使用这个方式初始化multimap容器时,其底层会先将每一个{key, value}创建成pair类型的键值对,然后再用已建好的各个键值对初始化multimap容器。有关于pair的用法,可以参照C++ pair的基本用法
事实上,也可以先手动创建好键值对,然后再用其初始化multimap容器。例如下面这两种方式是等价的:

//借助pair类模板的构造函数生成各个pair类型的键值对
multimap<string,int> mymultimap
{
    pair<string,int>{"penny",1},
    pair<string,int>{"leonard",2},
    pair<string,int>{"sheldon",3}
};

//调用make_pair()函数,生成键值对元素;然后创建并初始化multimap容器
multimap<string,int> mymultimap
{
    make_pair("penny", 1),
    make_pair("leonard",2),
    make_pair("sheldon",3)
};

3.3拷贝(复制)构造函数,也可以初始化新的multimap容器。

multimap<string,int> newmultimap(mymultimap);

用上面的代码就可以创建一个和mymultimap完全一样的newmultimap容器。
在C++ 11标准中,还为multimap类增添了移动构造函数。即当有临时的multimap容器作为参数初始化新的multimap容器时,其底层就会调用移动构造函数来实现初始化操作。

//创建一个会返回临时multimap对象的函数
multimap<string,int> tmpmultimap()
{
    multimap<string,int> tempmultimap{{"penny",1},{"leonard",2}};
    return tempmultimap;
}

//在main函数中调用multimap类模板的移动构造函数创建newmultimap容器
multimap<string,int> newmultimap(tmpmultimap());

tempmultimap容器是一个临时对象,因此初始化newmultimap容器时,底层调用的是multimap容器的移动构造函数,而不再是拷贝构造函数。

3.4multimap类模板还支持从已有的multimap容器中,选取某块区域内的所有键值对,用作初始化新multimap容器时使用。

#include<iostream>
#include<map>
#include<string>
using namespace std;

int main() 
{
    //创建并初始化multimap容器
    multimap<string, int> mymultimap
    {
        {"penny",1},{"leonard",2},{"sheldon",3},{"howard",4} };

    multimap<string, int> newmultimap(++mymultimap.begin(), mymultimap.end());

    for (auto iter = newmultimap.begin(); iter != newmultimap.end(); iter++) 
    {
        cout << iter->first << " " << iter->second << endl;
    }

    return 0;
}

执行结果:

leonard 2
penny 1
sheldon 3

3.5前面提到,multimap类模板总共可以接收4个参数,其中第3个参数可以用来修改multimap容器内部的排序规则。默认情况下,此参数的值为std::less<T>,即升序排列,这意味着下面两种创建multimap容器的方式是等价的:

multimap<string, int> mymultimap{{"penny",1},{"leonard",2}}; 
multimap<string, int, less<string>> mymultimap{{"penny",1},{"leonard",2}};

容器中键值对的存储顺序均为<“leonard”,2> , <“penny”, 1>。
若想要multimap容器中的键值对降序排列,可以使用模板库中提供的std::greater<T>排序函数:

multimap<string, int, greater<string>> mymultimap{{"penny",1},{"leonard",2}};

此时,multimap容器中键值对的存储顺序为<“penny”,1> , <“leonard”,2>。

4.multimap容器包含的成员方法

4.1multimap容器大小

成员方法 功能
empty() 若容器为空,则返回true,否则返回false
size() 返回当前multimap容器中键值对的个数
max_size() 返回multimap容器所能容纳的键值对的最大个数,不同的操作系统,其返回值亦不同
count(key) 在当前multimap容器中,查找键为key的键值对的个数并返回

4.2multimap容器中键值对的访问与遍历

成员方法 功能
begin() 返回指向容器中第一个(已排好序的第一个)键值对的双向迭代器
end() 返回指向容器中最后一个元素(已排好序的最后一个)所在位置的后一个位置的双向迭代器
rbegin() 返回指向容器中最后一个(已排好序的最后一个)元素的反向双向迭代器
rend() 返回指向容器中第一个(已排好序的第一个)元素所在位置的前一个位置的反向双向迭代器
cbegin() 和begin()功能相同,只不过在其基础上,增加了const属性,不能用于修改容器内储存的键值对
cend() 和end()功能相同,只不过在其基础上,增加了const属性,不能用于修改容器内储存的键值对
crbegin() 和rbegin()功能相同,只不过在其基础上,增加了const属性,不能用于修改容器内储存的键值对
find(key) 在map容器中查找键为key的键值对,若成功找到,则返回指向该键值对的双向迭代器;若未找到,则返回和end()方法一样的迭代器
lower_bound(key) 返回一个指向当前map容器中第一个大于或等于key的键值对的双向迭代器
upper_bound(key) 返回一个指向当前map容器中第一个大于key的键值对的双向迭代器
equal_range(key) 返回一个pair对象(包含2个双向迭代器),其中pair.first和lower_bound()方法的返回值等价,pair.second和upper_bound()方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为key的键值对(map容器键值对唯一,因此该返回最多包含一个键值对)

4.3multimap插入数据

成员方法 功能
insert() 向multimap容器中插入键值对
emplace() 在当前multimap容器中的指定位置处构造新键值对。其效果和插入键值对一样,但效率更高
emplace_hint() 在本质上和emplace()在multimap容器中构造新键值对的方式是一样的,不同之处在于,必须为该方法提供一个指示键值对生成位置的迭代器,并作为该方法的第一个参数

4.4multimap删除数据

成员方法 功能
erase() 删除multimap容器指定位置、指定键(key)值或者指定区域内的键值对
clear() 清空multimap容器中的所有键值对

4.5multimap交换数据

成员方法 功能
swap() 交换2个multimap容器中存储的键值对,操作的2个键值对的类型必须相同

5.说明

和map容器相比,multimap未提供at()成员方法,也没有重载[ ]运算符。
这意味着,map容器中通过指定键获取指定键值对的方式,将不再适用于multimap容器。
其实这也很好理解,因为multimap容器中指定的键可能对应多个键值对,而不再是一个。
另外,由于maltimap容器可存储多个具有相同键的键值对,因此lower_bound()、upper_bound()、equal_range()以及count()方法经常会用到。

参考:[STL —— multimap的用法详解](STL —— multimap的用法详解_薛定谔的猫ovo的博客-CSDN博客)

标签:容器,multimap,map,STL,115,键值,key,pair
From: https://www.cnblogs.com/codemagiciant/p/17575235.html

相关文章

  • 114.STL中的map
    114.STL中的map1.map的简介map是C++STL中的一个关联式容器,它提供一对一的hash,它类似于Python中的字典,也有着键值对(Key-Value)这一说。我们可以通过键(Key)来找到值(Value),但需要注意的是,每个键(Key)只能在map中出现一次哦!map可以储存多种类型的数据,它主要用于一对一映射的情况,map内部......
  • 113.STL中的pair
    113.STL中的pair1.pair的简介pair是C++STL(标准模板库)中的一个现有容器,它将2个数据整合成一组数据,当我们类似需求的时候就可以使用到pair啦!pair其实有点像Python中字典中的键值对(Key-Value),一个Key对应着一个Value。pair的本质其实就是个结构体,它含有两个成员变量first和second。......
  • C++ stl锁的使用
    我们在日常开发中经常要用到锁,这里记录一下实际开发过程中stl提供的锁的使用。1、读写锁读写锁算是用到的比较多的一种类型,主要实现对于同一个共享数据区,一个时间点只能有一个线程进行写(增删改),但可以有多个线程同时读(查)。换句话说,当有一个线程写的时候,其他线程(不管是读线程还是......
  • 112.STL中的array
    112.STL中的array1.array介绍在C++标准库中,array是固定大小的序列容器,array中包含特定个数并且严格按照线性序列排序的元素。因此array允许对元素进行随机访问,指向某一元素的指针可以通过偏移访问其他元素。在array内部,它只保存自己包含的元素,其他任何信息都不保存,包括自身的大......
  • CF1155F Delivery Oligopoly 警告与思考--zhengjun
    警告:注意区分【强连通分量】,【边双联通分量】,【点双连通分量】。思考:之前没有做到过边双连通分量的拆解;一个边双联通分量可以看作一个基环上不断加一条链;注意,这里加的链首尾可以为同一个位置。到这步代码就好弄了。代码#include<bits/stdc++.h>usingnamespace......
  • AP5165B LED降压恒流驱动器 车灯 替代PT4115 支持PWM调光 线性调光
    产品应用原理图5-36V耐压3W射灯应用线路图产品描述AP5165B是一款外围电路简单的连续电流模式的降压型LED恒流驱动芯片。在输入电压高于LED电压时,可以有效地用于驱动一颗或者多颗串联LED。输出电流可调,最大可达1A。适用于3-36V电压范围的非隔离式恒流LED驱动领域。AP5165B......
  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解
    发现挨位考虑填哪个不太现实,考虑值域。令\(dp_{i,j,st}\)表示考虑到\(i\),此时序列长度为\(j\),\(i-m\)到\(i-1\)填空状态为\(st\)的方案数,考虑选/不选数即可:\(dp_{i,j,st}\times(\text{popcount}(st)+1)\todp_{i+1,j+1,(2st+1)\&2^m},dp_{i+1,j,(2st)\&2^m}\)乘上那......
  • 暑假对STL的学习用法
    mapmap<int,int>s;map<int,vector<int>>s;map<int,list<int>>s;这些就是map的初始化法子,前面那个就相当于数组下标,后面的就是键值了,可以用它搞二维数组就像第二三个一样。然后就是他的用处,他可以自动排序,但是是按照前面的key值排序,就是下标拉,不过看你怎么用这个东西,这......
  • Whistle(基于Node实现的跨平台转包调试工具)的使用
    可抓包,可显示vconsolet调试一、安装npmi-gwhistle二、启动手机和电脑处于同一网络w2start--init浏览器打开地址:http://127.0.0.1:8899/三、配置Rules:https://testh.app.coc.10086.cnwhistle.inspect://vConsoleconsole安装插件: w2installwhistle.ins......
  • hdu 1150 Machine Schedule
    二部图问题:每个任务的两种模式对应一条边,那么最大的匹配数就是最多的任务不用改变模式的任务数。相当于求最小点覆盖,而最小点覆盖=最大匹配数 代码:#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>usingnamespacestd;#defineMAXN110intuN,......