STL —— multimap的用法详解
文章目录
- multimap的基本性质
- STL——multimap容器的用法
- multimap容器的创建与初始化
- multimap容器包含的成员方法
- multimap容器大小
- multimap容器中键值对的访问与遍历
- multimap插入数据
- multimap删除数据
- multimap交换数据
- 说明
multimap的基本性质
multimap容器是和map容器相似的关联式容器,所谓“相似”,是指multimap容器具有和map容器相同的特性,即multimap容器也存储pair<const K, T>类型的键值对(其中K表示键的类型,T表示值的类型),其中各个键值对的键的值不能被修改;并且,该容器也会自行根据键的大小对所存储的所有键值对做排序操作。
multimap容器和map容器的区别在于,multimap容器中可以同时存储多个键相同的键值对。
multimap容器提供的成员方法,map容器都有提供,并且它们的用法是相同的。详细的用法请参照map的用法及实例详解。本文只是给出了所有在multimap中的成员函数及其实现功能,具体的实例及代码请参照map容器。
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个参数,最后一个参数几乎不会用到。
multimap容器的创建与初始化
multimap类模板内部提供多个构造函数,创建multimap容器的方式可以总结为以下5种。
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; //0return 0;
}
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)拷贝(复制)构造函数,也可以初始化新的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容器的移动构造函数,而不再是拷贝构造函数。
4)multimap类模板还支持从已有的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;
}
执行结果:
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>。
multimap容器包含的成员方法
multimap容器大小
成员方法 | 功能 |
---|---|
empty() | 若容器为空,则返回true,否则返回false。 |
size() | 返回当前multimap容器中键值对的个数。 |
max_size() | 返回multimap容器所能容纳的键值对的最大个数,不同的操作系统,其返回值亦不同。 |
count(key) | 在当前multimap容器中,查找键为key的键值对的个数并返回。 |
multimap容器中键值对的访问与遍历
成员方法 | 功能 |
---|---|
begin() | 返回指向容器中第一个(已排好序的第一个)键值对的双向迭代器。 |
end() | 返回指向容器中最后一个元素(已排好序的最后一个)所在位置的后一个位置的双向迭代器。 |
rbegin() | 返回指向容器中最后一个(已排好序的最后一个)元素的反向双向迭代器。 |
rend() | 返回指向容器中第一个(已排好序的第一个)元素所在位置的前一个位置的反向双向迭代器。 |
cbegin() | 和begin()功能相同,只不过在其基础上,增加了const属性,不能用于修改容器内储存的键值对。 |
cend() | 和end()功能相同,只不过在其基础上,增加了const属性,不能用于修改容器内储存的键值对。 |
crbegin() | 和rbegin()功能相同,只不过在其基础上,增加了const属性,不能用于修改容器内储存的键值对。 |
crend() | 和rend()功能相同,只不过在其基础上,增加了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容器键值对唯一,因此该返回最多包含一个键值对)。 |
multimap插入数据
成员方法 | 功能 |
---|---|
insert() | 向multimap容器中插入键值对。 |
emplace() | 在当前multimap容器中的指定位置处构造新键值对。其效果和插入键值对一样,但效率更高。 |
emplace_hint() | 在本质上和emplace()在multimap容器中构造新键值对的方式是一样的,不同之处在于,必须为该方法提供一个指示键值对生成位置的迭代器,并作为该方法的第一个参数。 |
multimap删除数据
成员方法 | 功能 |
---|---|
erase() | 删除multimap容器指定位置、指定键(key)值或者指定区域内的键值对。 |
clear() | 清空multimap容器中的所有键值对。 |
multimap交换数据
成员方法 | 功能 |
---|---|
swap() | 交换2个multimap容器中存储的键值对,操作的2个键值对的类型必须相同。 |
说明
和map容器相比,multimap未提供at()成员方法,也没有重载[ ] 运算符。
这意味着,map容器中通过指定键获取指定键值对的方式,将不再适用于multimap容器。
其实这也很好理解,因为multimap容器中指定的键可能对应多个键值对,而不再是一个。
另外,由于maltimap容器可存储多个具有相同键的键值对,因此lower_bound()、upper_bound()、equal_range()以及count()方法经常会用到。
再次说明,multimap容器提供的成员方法,map容器都有提供,并且它们的用法是相同的。详细的用法请参照map的用法及实例详解。
STL —— multimap的用法详解相关推荐
- C++ STL容器 —— array 用法详解
C++ STL容器 -- array 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别人的博客终究是 ...
- map和multimap的用法详解
一.map的文档总结 1.map是关联式容器,它按照key值比较存储,默认是小于: 2.在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容:键值key和valu ...
- STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
- [转] STL中map用法详解
一.Map概述 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完 ...
- STL中list用法详解
本文转载自百度文库.作者如下.其中下面的count, count_if等函数的使用有些陈旧,如在编译时遇到问题,请百度. 标准模板库(STL)介绍 作者:Scott Field 本文以List容器为例 ...
- STL之string用法详解
2.1 string容器介绍 string也属于STL常用容器之一,因此vector(参考博客)中的大部分方法与迭代器都适用于string容器.string容器用于保存字符串,使用一组连续的内存单元来 ...
- STL:list用法详解
list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间. ...
- STL:bitset用法详解
文章目录 前言 声明 输入输出 访问与修改 位运算 所谓bitset,就是bit组成的set (逃) 前言 bitset的诸多好处: 1.节约空间 2.增加一些新的功能 3.几乎没有副作用 4.有了1 ...
- c 语言中set的用法,C++中set用法详解
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
最新文章
- centos 下 django 1.8 配置好后 admin 后台无法显示 样式解决办法
- java、sqlserver复习
- 一个实例带你搞懂Apriori关联分析算法
- python配置文件转dict
- SPS:设置访问群体
- 计算机显微视觉相关概念,计算机视觉热门科研!基于深度神经网络的蛋白质智能显微分类系统,已开启!...
- git生成key以及小乌龟git不需要密码
- 计算机音乐有哪些优势,谈谈用电脑听无损音乐的好处
- win10修改服务器时间,win10设置时间服务器地址
- 机器视觉——远心镜头(1)
- 名校认证证书、免费课程……留学生不会告诉你的10个宝藏自学网站
- 特斯拉供应商同意接手一家通用汽车在韩国的电动汽车制造厂
- Object.assign()的使用和注意
- 【CSS】:中文颜色名称对照
- Java人民币小写转大写字符串
- 【DS实践 | Coursera】Assignment 2 | Applied Plotting, Charting Data Representation in Python
- istio-code
- 买笔记本电脑的注意事项
- TP5 入口文件提到根目录
- 目标跟踪实战deepsort+yolov5(上)
热门文章
- SpringBoot整合Druid,开启druid监控平台
- visual studio 和visual studio code 的区别
- 阿里云2003系统服务器配置,windows server 2003 文件服务器配置
- ArcBlock 分享 | 多数人只关注眼前赛道的大小,而忽视了变化
- java 静态方法顺序_静态方法的加载顺序详解
- vue 中使用自定义字体
- 查缺补漏系统学习 EF Core 6 - 批量操作
- 基于SSM的公益捐赠管理系统设计与实现 Spring+SpringMVC+MyBatis
- python四条折线统计图_人教新课标数学四下:单式折线统计图 教案
- 二维数组赋值给vector