C++ map的常用用法(超详细)(*^ー^)人(^ー^*)_c++ map用法-程序员宅基地

技术标签: 算法  c++  散列表  蓝桥杯  算法竞赛  数据结构  

C++中的map翻译为映射,不是地图!!! 也是常用的STL容器。它在算法竞赛中应用十分广泛,因为map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器),十分灵活。因此我们很有必要来熟练map的常用用法。

目录

1、map的定义

2、map容器内元素的访问

3、map常用函数实例解析:

1、find():

2、erase():

3、size():

4、clear():

4、拓展


1、map的定义

单独定义一个map:

map<typename1, typename2> mp;

其中,typename1是的类型,typename2是的类型。

注:如果是字符串到整型的映射,必须使用string而不能用char数组!

map<string, int> mp;

这是因为char数组作为数组,是不能被作为键值的。所以如果想用字符串做映射,必须用string

再举个栗子例子:map的键和值也可以是STL容器,例如以下代码将一个set容器映射到一个字符串:

map<set<int>, string> mp;

2、map容器内元素的访问

一般有两种访问方式:通过下标访问或通过迭代器访问:

1、通过下标访问:

和普通数组一样,例如一个定义为map<char, int> mpmap来说,可以直接使用mp['c']的方式来访问它对应的int整数。可以直接使用mp['c'] = 20这样的方式来赋值:

map<char, int> mp; 
mp['c'] = 20;
cout << mp['c'];	//答案输出20

但是要注意的是,map中的键是唯一的,例如以下代码:

map<char, int> mp; 
mp['c'] = 20;
mp['c'] = 30;	//30覆盖了20 
mp['c'] = 666; 	//666覆盖了30 
cout << mp['c'];	//答案输出666 

2、通过迭代器访问:

map迭代器的定义和其他STL容器迭代器定义的方式相同:

map<typename1, typename2>::iterator it;

这样就得到了迭代器 it

map可以使用it->first来访问it->second来访问

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first;	 
		cout << " "; 
		cout << it->second;
		cout << endl;
	} 	
	return 0;
}

代码输出结果:

a 222
b 333
c 444

还有一点要补充,就是map会以从小到大的顺序自动排序,如:

mp['c'] = 222;
mp['a'] = 333;	
mp['b'] = 444;

顺序输出结果是(即按a < b < c的顺序从小到大排序):

a 333
b 444
c 222

上述现象是因为,map内部是由实现的(set也是),在建立映射的过程中,会自动实现从小到大排序功能。

3、map常用函数实例解析:

1、find():

find(key)返回键为key映射的迭代器,时间复杂度为O(logN),N为map中映射的个数:

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	map<char, int>::iterator it = mp.find('b');
	cout << it->first << " " << it->second;
	return 0;
}

输出结果:

b 333

2、erase():

erase()有两种用法:1、删除单个元素。2、删除一个区间内所有的元素

① 删除单个元素:

mp.erase(it)it为需要删除的元素的迭代器。时间复杂度为O(1):

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	map<char, int>::iterator it = mp.find('b');
	mp.erase(it);
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

输出结果:

a 222
c 444

mp.erase(key)key为要删除的映射的键。时间复杂度O(logN),N为map内元素的个数:

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	//map<char, int>::iterator it = mp.find('b');
	//mp.erase(it);
	mp.erase('b');
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

输出结果:

a 222
c 444

② 删除一个区间内所有的元素:

mp.erase(first, last),其中,first为需要删除的区间的起始迭代器last为需要删除的区间末尾迭代器的下一个地址,即为删除左闭右开的区间[first, last)。时间复杂度为O(last - first):

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	map<char, int>::iterator it = mp.find('b');
	mp.erase(it, mp.end()); //删除it之后的所有映射,即b 333和 c 444 
	//mp.erase(it);
	//mp.erase('b');
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

输出结果:

a 222

3、size():

size()用来获得map中映射的对数,复杂度为O(1)。

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	cout << mp.size(); 
	return 0;
}

输出结果:

3

4、clear():

clear()用来清空map中的所有元素,复杂度为O(N),N为map中元素个数:

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char, int> mp; 
	mp['a'] = 222;
	mp['b'] = 333;	
	mp['c'] = 444;
	mp.clear();	//清空map
	cout << mp.size(); 
	return 0;
}

输出结果:

0

4、拓展

        map的键和值是唯一的,如果需要一个键对应多个值,就只能用multimap。另外,C++11标准新增了unordered_map,以散列代替map内部的红黑树实现,使其可以用来处理只映射而不按key排序的需求,速度比map快得多

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

智能推荐

监控神器Prometheus,开箱即用!-程序员宅基地

文章浏览阅读244次。文章来源:【公众号:云加社区】‍目录简介整体生态工作原理Metric 指标PromQLGrafana 可视化监控告警简介Prometheus 是一个开源的完整监控解决方案,本文将从指标抓取到查询及可视化展示,以及最后的监控告警,对 Prometheus 做一个基本的认识。Prometheus 是古希腊神话里泰坦族的一名神明,名字的意思是“先见之明”,下图中是 Promet..._dtm prometheus

实验五 -1 快速排序算法和直接插入排序算法-程序员宅基地

文章浏览阅读900次,点赞15次,收藏6次。对数据序列{6,8,7,9,0,1,3,2,4,5},请分别用快速排序算法和直接选择排序设计算法对数据序列进行排序;

10000以内的同构数-程序员宅基地

文章浏览阅读597次。/*找出10000以内的同构数同构数 376*376=141376思路:1、输入一个数num 先判断是几位数。记住数位length。 2、然后算它(num)的平方, square。 3、取square的后length位的数值temp 4、temp与num相等,则是同构数。*/#include <iostream>#include &..._小于10000的同构数

js实现文字转语音功能tts_js tts-程序员宅基地

文章浏览阅读5.1k次,点赞3次,收藏26次。写了很久的语音呼叫功能、调用在线语音合成的调用系统自带的;现在客户又要求搞网页版的语音呼叫还是不带联网的。客户太难伺候了详细使用请参考 【web语音API】完整代码<!DOCTYPE><html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"><head><title>网页文字转语音</title><meta http-equiv="Content-Typ._js tts

Java经典问题(百僧吃百馍)-程序员宅基地

文章浏览阅读62次。System.out.println("100个和尚吃了100个馒头 ,100和尚有大和尚和小和尚,一个大和尚能吃3馒头,三个小和尚吃1个馒头,问大和尚和小和尚有多少个?System.out.println("大和尚有"+i+"个人");System.out.println("小和尚有"+j+"个人");System.out.println("查看答案请按回车键");

vacode模块使用报错的问题_indesssss.html:1 access to script at 'file:///i:/v-程序员宅基地

文章浏览阅读651次。在vscode中是用模块化的时候会出现报错,提示如下Access to script at ‘file:///F:/%E5%AD%A6%E4%B9%A0/%E7%BA%BF%E4%B8%8BJS/test/js./modul.js’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, ch_indesssss.html:1 access to script at 'file:///i:/vscode/cheshi/tesss.js' fro

随便推点

设计模式--组合模式-程序员宅基地

文章浏览阅读47次。定义:允许将对象组成树形结构来表现 “整体/部分” 层次结构。组合能让客户以一致的方式处理个别对象及对象组合。说白了,就是类似于树形结构。 只是它要求子节点和父节点都具备统一的接口。类图如下:示例如下:比如我们常见的电脑上的目录,目录下面有文件夹,也有文件,然后文件夹里面还有文件及文件夹。这样一层层形成了树形结构。示例代码如下:#include <iostream>#include <stdio.h>#include "string"#includ..

Kotlin相关面试题_kotlin面试题-程序员宅基地

文章浏览阅读1.9w次,点赞26次,收藏185次。目录一.请简述下什么是kotlin?它有什么特性?二.Kotlin 中注解 @JvmOverloads 的作用?三.Kotlin中的MutableList与List有什么区别?四.kotlin实现单例的几种方式?五. kotlin中关键字data的理解?相对于普通的类有哪些特点?六.什么是委托属性?简单说一下应用场景?七.kotlin中with、run、apply、let函数的区别?一般用于什么场景?八.kotlin中Unit的应用以及和Java中void的区别?九.Ko_kotlin面试题

HEVC英文缩写及部分概念整理(1)--博主整理_反量化 英文缩写-程序员宅基地

文章浏览阅读2.8k次。有这个想法一方面是确实很多时候会记不得一些缩写是什么意思。另外也是受 http://blog.csdn.net/lin453701006/article/details/52797415这篇博客的启发,本文主要用于自己记忆 内容主要整理自http://blog.sina.com.cn/s/blog_520811730101hmj9.html http://blog.csdn.net/feix_反量化 英文缩写

超级简单的Python爬虫入门教程(非常详细),通俗易懂,看一遍就会了_爬虫python入门-程序员宅基地

文章浏览阅读7.3k次,点赞6次,收藏36次。超级简单的Python爬虫入门教程(非常详细),通俗易懂,看一遍就会了_爬虫python入门

python怎么输出logistic回归系数_python - Logistic回归scikit学习系数与统计模型的系数 - SO中文参考 - www.soinside.com...-程序员宅基地

文章浏览阅读1.2k次。您的代码存在一些问题。首先,您在此处显示的两个模型是not等效的:尽管您将scikit-learn LogisticRegression设置为fit_intercept=True(这是默认设置),但您并没有这样做statsmodels一;来自statsmodels docs:默认情况下不包括拦截器,用户应添加。参见statsmodels.tools.add_constant。另一个问题是,尽管您处..._sm fit(method

VS2017、VS2019配置SFML_vsllfqm-程序员宅基地

文章浏览阅读518次。一、sfml官网下载32位的版本 一样的设置,64位的版本我没有成功,用不了。二、三、四以下这些内容拷贝过去:sfml-graphics-d.libsfml-window-d.libsfml-system-d.libsfml-audio-d.lib..._vsllfqm

推荐文章

热门文章

相关标签