map和multimap的用法详解_multimap用法-程序员宅基地

技术标签: C++  multimap  map  

一、map的文档总结

1、map是关联式容器,它按照key值比较存储,默认是小于;

2、在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容;键值key和value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名为pair;

3、map中的元素是键值对;

4、map中的key是唯一的,并且不能修改,遇到重复的key就会插入失败;但可以利用operator[]对value进行修改;

5、map的底层实现为红黑树,查找效率比较高,是O(logN);

二、关于键值对pair

STL中对于键值对的定义:

template <class T1,class T2>
struct pair
{
	typedef T1 first_type;
	typedef T2 second_type;
	
	T1 first;
	T2 second;
	
	pair()
		: first(T1())
		, second(T2())
	{}
	pair(const T1&a, const T2&b)
		: first(a)
		, second(b)
	{}
};

三、map的重要接口

1、insert

下面是这两种插入方式的返回值的解释:

下面介绍一下insert的使用

int main()
{    
    map<string, string> m;
	//map底层是键值对的形式存储,所以在插入的时候要构造键值对
	m.insert(pair<string,string>("apple", "苹果"));
	m.insert(make_pair("apple", "苹果"));
	m.insert(make_pair("banana", "香蕉"));
	m.insert(make_pair("banana", "香蕉"));
	m.insert(make_pair("peach", "桃子"));
    map<string, string>::iterator it = m.begin();
	//m.insert(it, make_pair("apple", "苹果"));
	while (it != m.end())
	{
		//*it取到pair,pair里面存的是键值对,然后再用.访问它里面的first和second
		//cout << (*it).first << ":" << (*it).second << endl;
		//(.)是结构体成员变量访问成员函数,(->)是结构体指针访问成员
		//pair是一个结构体指针
		cout << it->first << ":" << it->second << endl;
		++it;
	}
	cout << endl;
    system("pause");
	return 0;
}

输出结果:

可以看出在插入的时候,map进行了排序和去重。

2、删除erase

删除键值为“ x ”的元素,以上述代码为例,删除键值为”apple“的元素

m.erase("apple");

3、交换swap

map的底层是一个平衡搜索树( 红黑树),所以交换的时候只用交换根节点即可。

利用上述插入代码,交换strs和m;

    map<string, string> strs;
	strs.insert(make_pair("apple", "aaa"));
	strs.insert(make_pair("banana", "bbb"));
	strs.insert(make_pair("banana", "xxx"));
	strs.insert(make_pair("peach", "ppp"));
	m.swap(strs);

输出结果:

4、find    查找键值为“X”的元素

返回值:

5、map的重点     operator[ ]

根据文档可看出,operator[ ] 插入的是key,返回的是与key对应的value。

先看一段代码:

mapped_type& operator[](const key_type& k)
{
	return (*((this->insert(make_pair(k, mapped_type()))).first)).second;
}

可以看出operator[ ] 中用到了插入函数,下面我们来分析一下这段让各位童鞋头疼的代码:

需要注意的是,当key存在时,找到与key对应的value,然后返回其引用;

当key不存在时,operator[ ]用默认value与key构造键值对然后插入,返回该默认的value。

6、operator[ ]支持元素的存取

map/multimap和set/multiset都是关联式容器,不支持对元素的直接存取,通过迭代器进行,但是map有个例外,利用operator[ ]直接存元素,并且下标不一定是整型,可以是任意类型,这种接口视为关联式数组。

并且,利用这种方式插入元素不存在数组越界的情况,如果使用一个可以作为索引,而该key尚不存在map中,map会重载operator[]插入新元素,新元素的value值由构造函数确定,一般为0.

例如:

m["orange"] = "橘子";

会经历如下操作:

处理  m["orange"]

          如果map中存在键值”orange“的元素,则返回该元素的引用;

          如果不存在,则自动创建值为“orange”的元素,key所对应的value由默认的构造函数赋值。

处理m["orange"] = "橘子"

          橘子通过赋值操作赋值给新诞生的元素“orange”。

结合insert的代码,输出结果为:

使用下标操作符接口,map的插入更加便捷,但该方式在效率上,同其他安插方式相比较慢一些。

四、multimap基本用法

multimap和map的功能类似,就不一一介绍了,下面主要说一下这两者的不同:

1、multimap中的key可以重复

2、multimap中没有重载operator[ ]功能

3、对于重复的元素,查找的时候也是返回中序遍历的第一个元素,至于为什么,前面讲set的时候已经介绍过了,若不理解,课参考这篇博客:https://blog.csdn.net/yam_sunshine/article/details/89340462

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yam_sunshine/article/details/89930311

智能推荐

feof() 巨坑有兴趣了解一下!!!_feof函数报错-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏5次。一、feof()是什么?feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0一般在文件操作,中经常使用feof()判断文件是否结束。二、feof()的经典错误#include<stdio.h>int main(void){ FILE *p; p = fopen("open.txt", "r"); if (feof(p)) { printf("文件为空。"); } else { _feof函数报错

android IO流_html文件的下载,如何使用字节流,如何使用转换流-程序员宅基地

文章浏览阅读96次。package com.jd.io;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputS..._为什么移动端通过bolb流的形式下载文件为undefied

Mockito单元测试学习笔记(1):Mockito简介_maven mockito-程序员宅基地

文章浏览阅读2.5k次。本文是自己学习的一个总结1、什么是单元测试我自己的理解是,单元测试就是面向函数的一个测试。这种测试只是针对函数内的逻辑进行测试。如果这个函数依赖了外界,那么单元测试是应该要屏蔽掉外界的影响的。比如web开发中,service层中有一个方法用来用来插入数据。public class Service implements ServiceImpl { /** * 这就是service中一个普通的方法,但它在执行过程中会依赖外部资源。 */ @Override public void in._maven mockito

HTML基础知识-程序员宅基地

文章浏览阅读2.7k次。一、基础知识:1.网站:许多网页的集合。2.HTML:超文本标记语言(Hyper Text Markup Language),用来描述网页的一种语言。不是一种变编程语言,而是一种标记语言。3.浏览器内核(渲染引擎):负责读取网页内容,整理讯息、计算网页的显示方式并显示页面。4.Web标准的组成..._html基础知识

理解covariance协方差 vs correlation coefficient相关系数_correlation coefficient和covariance-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏4次。covarianceFrom wikipedia, in probability theory and statistics, covariance is a measure of the joint variability of two random variables.If the greater values of one variable mainly correspond with the greater values of the other variable, and the sa.._correlation coefficient和covariance

手机端页面在项目中遇到的一些问题及解决办法_项目中手机端同一网络下为什么有的页面图片不显示-程序员宅基地

文章浏览阅读526次。1.解决页面使用overflow: scroll在iOS上滑动卡顿的问题?首先你可能会给页面的html和body增加了height: 100%, 然后就可能造成IOS上页面滑动的卡顿问题。解决方案是:(1) 看是否能把body和html的height: 100%去除掉。(2) 在滚动的容器中增加:-webkit-overflow-scrolling: touch或者给body增加:body {ov..._项目中手机端同一网络下为什么有的页面图片不显示

随便推点

Qt开发技术:QCharts(三)QCharts样条曲线图介绍、Demo以及代码详解_qt5.14.1 qchar 添加离散点的序号-程序员宅基地

文章浏览阅读3.8w次,点赞14次,收藏81次。若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108022984各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用_qt5.14.1 qchar 添加离散点的序号

Maven项目管理(一) IntelliJ Idea+Maven环境搭建与基于命令行的基本使用_bulidsystem选intellij和maven-程序员宅基地

文章浏览阅读1.6w次。MavenMAVEN是一个强大的构建工具,ItelliJ Idea 是个强大的IDE,帮他们联合起来使用,将会是多么美妙的事情。但是IDE中集成的Maven总使习惯使用命令行的我们头大,不想为了使用IDE重新学习如何使用怎么办,那么就通过配置环境兼容就好了。Maven的准备安装之前通过terminal输入java -version,查看是否已经安装JAVA的JDK和JRElinux下apt-ge_bulidsystem选intellij和maven

搞机: oh-my-zsh + autojump + screen 让你的终端起飞_ohmyzsh autojump-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏13次。用了这没久ubuntu了,才知道有oh-my-zsh这种东西,真是相见恨晚啊~1. oh-my-zsh安装使用说到oh-my-zsh先要说一下zsh。zsh是linux的命令指示器类似于bash,我么平时使用的就是bash,支持的配置比较多方式比较多,使用起来跟bash也没啥区别,会使用bash就能直接上手没啥学习成本。oh-my-zsh是一个配置zsh的项目,用于美化zsh界面,并提供一些智能插件,可以很大程度提升使用命令行的效率。1.1 zsh安装我用的是ubuntu系统,演示ubuntu安._ohmyzsh autojump

Power BI中DAX的动态计算方差-程序员宅基地

文章浏览阅读748次。我花了一点时间试图解决一个棘手的DAX表达式,那就是如何动态计算方差,下面我们认识一下这两个函数:PARALLELPERIOD和SAMEPERIODLASTYEAR它能实现我们想要的结果,我们可以选择随机区域,并且根据切片器选择不同时间段,智能得到时间段的差异。先看一下我的数据:下面我们创建一个 Previous Period度量值..._powerbi计算标准差

android修改包名、生成签名文件、Android Studio获取开发版SHA1值和发布版SHA1值_修改apksha1-程序员宅基地

文章浏览阅读1.7k次。不常用。但是每次用的时候都要百度,所以自己记录一下。仅供参考。一。修改包名1.修改自己文件的包名。如果没有完全打开包结构,把包全部展开。 然后点击要修改的包名右键Refactor-&gt;Rename或者shift+F6然后选择 Rename package修改好包名。选择refactor然后选择Do Refactor2 .查看清单文件的包名 这..._修改apksha1

TCP——多进程编程(1)_tcp多进程-程序员宅基地

文章浏览阅读277次。1、什么是进程在操作系统原理使用这样的术语来描述的:正在运行的程序及其占用的资源(CPU、内存、系统资源等)叫做进 程。我们使用vim编辑生成的C文件叫做源码,源码给程序员来看的但机器不识别,这时我们需要使用 编译器gcc编译生成CPU可识别的二进制可执行程序并保存在存储介质上,这时编译生成的可执行程序只能叫做程序而不能叫进 程。而一旦我们通过命令(./a.out)开始运行时,那正在运行的这个程..._tcp多进程

推荐文章

热门文章

相关标签