C++ 二维、三维 map 的使用_Tyler_Zx的博客-程序员宝宝_c++ 二维map

技术标签: C/C++  多维map  map  Stl map  

前言

最近复习了一下 map 的使用,因为使用的都是一维的,所以使用常规操作就能满足需求。以前看到过有人在工作环境中使用多维度的 map,当时没有尝试实现这种需求,今天想起来了就试了下。类似于 map<string, map<string, string>>  这种形式。常规操作是对数据的增删查改

 

二维 map

创建一个二维map,这里以string为例:

map<string, map<string, string>> b;

 

增加元素

增加元素可分为两种情况:(1) 增加若干个数据时可以使用 map 中的 insert() 方法,或者 insert_or_assign() 方法。两者的区别:使用insert()方法时,若相应key不存在,则完成插入操作。反之,则不做插入操作。使用 insert_or_assign() 方法时,若相应 key 不存在,则完成插入操作。反之,完成赋值操作。

(2) 增加单独的数据可以使用赋值方法 test[ "维度1" ][ "维度2" ] = " 字符串 ";,这种方法既简单又方便。若原容器中没有相应的 key ,则完成插入操作,反之完成赋值操作。

for(int i = 0; i < 3; i++)
{
	temp = to_string(i);
	c.insert(make_pair(temp, "string"));
}

//将含有3个元素的 map c 插入到 map b中
b.insert(make_pair(temp, c));

//添加一个元素
b["2"]["1"] = "123456";

 

删除元素

使用 map 中的 erase() 方法删除容器中的一个值或某一维度下的全部值 (删除键为 key 的若干条数据) 。

b["2"].erase("1");
在第一个维度 key 为 "2" 的前提下,删除第二个维度 key 为 "1" 的值。

b.erase("1");
表明删除第一个维度 key 为 "1" 的所有的值。

 

查找与修改

简单的查找可以使用 map 中的 find() 完成,这里主要介绍遍历时的操作。遍历是最常用的查找操作,在遍历过程中,满足一定条件后完成相应的操作。修改操作可以使用赋值语句完成,这里不再赘述。若想对一个二维 map 进行遍历,需要使用两个迭代器,具体请看代码:

void Print(map<string, map<string, string>> a)
{
	map<string, map<string, string>>::iterator p2;
	map<string, string>::iterator p3;

	for(p2 = a.begin(); p2 != a.end(); p2++)
	{
		for(p3 = p2->second.begin(); p3 != p2->second.end(); p3++)
			cout << p2->first << ":" << "[" <<p3->first << "]" << "[" << p3->second << "]" <<endl;
	}
	cout <<endl;
}

修改容器中特定的数据,可以进行遍历,然后对满足条件的元素完成操作,其做法类似于一维 map 的操作:

#include <map>
#include <iostream>
int main()
{
	std::map<int, std::string> c = {
   {1, "one"}, {2, "two"}, {3, "three"},
		{4, "four"}, {5, "five"}, {6, "six"}};

	for(auto it = c.begin(); it != c.end(); )
		if(it->first % 2 == 1)
			//完成相应操作
		else
			++it;
	for(auto& p : c)
		std::cout << p.second << ' ';
}

 

完整代码:

#include <iostream>
#include <map>
#include <string>

using namespace std;

void Print(map<string, map<string, string>> a)
{
	map<string, map<string, string>>::iterator p2;
	map<string, string>::iterator p3;

	for(p2 = a.begin(); p2 != a.end(); p2++)
	{
		for(p3 = p2->second.begin(); p3 != p2->second.end(); p3++)
			cout << p2->first << ":" << "[" <<p3->first << "]" << "[" << p3->second << "]" <<endl;
	}
	cout <<endl;
}

int main()
{
	map<string, map<string, string>> b;
	map<string, string> c;
	string temp;

	//对 map c 进行初始化
	for(int i = 0; i < 3; i++)
	{
		temp = to_string(i);
		c.insert(make_pair(temp, "string"));
	}

	//将 map c 插入到 map b 中
	b.insert(make_pair(temp, c));
	cout << "Init:" <<endl;
	Print(b);

	//修改数据
	b["2"]["1"] = "123456";
	b["2"]["2"] = "qweasd";
	cout << "Modified:" <<endl;
	Print(b);

	b["2"].erase("1");
	cout << "Erase:" <<endl;
	Print(b);

	cout << "Add element:" <<endl;
	b["3"]["3"] = "3333";   
	Print(b);

	return 0;
}

 

三维 map

三维 map 的操作和二维 map 的操作相同,只是多了一个维度,这里仅放一个简单的代码作为参考:

#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

void Print(map<string, map<string, map<string, string>>> a)
{
	map<string, map<string, map<string, string>>>::iterator p1;
	map<string, map<string, string>>::iterator p2;
	map<string, string>::iterator p3;
	for(p1 = a.begin(); p1 != a.end(); p1++)
	{
		for(p2 = p1->second.begin(); p2 != p1->second.end(); p2++)
		{
			for(p3 = p2->second.begin(); p3 != p2->second.end(); p3++)
				cout << "Row:[ " << p1->first << " ] Column:[ " << p2->first << " ] Timestamp:" << "[ " <<p3->first << " ]" << " ->  [" << p3->second << "]" <<endl;
		}
	}
	cout <<endl;
}

int main()
{
	map<string, map<string, map<string, string>>> a;
	map<string, map<string, string>> b;
	map<string, string> c;
	string temp;
	
	//初始化并插入
	for(int i = 0; i < 2; i++)
	{
		temp = to_string(i);
		c.insert(make_pair(temp, "string"));
		b.insert(make_pair(temp, c));
		a.insert(make_pair(temp, b));
	}
	cout << "Init:" <<endl;
	Print(a);

	//修改
	a["1"]["1"]["0"] = "123456";
	a["1"]["1"]["1"] = "qwerty";
	cout << "Modified:" <<endl;
	Print(a);


	a["1"].erase("1");
	cout << "Erase column == 1:" <<endl;
	Print(a);

	a.erase("1");
	cout << "Erase row == 1:" <<endl;
	Print(a);
	
	return 0;
}

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

智能推荐

剑指offer 专项突破版 71、按权重生成随机数_抓抓璐璐小可爱(๑• . •๑)的博客-程序员宝宝

题目链接思路:前缀和+二分查找首先我们新建一个前缀和数组,比如nums为[1,2,3,4],前缀和数组便为[1,3,6,10]可以知道,nums数组的和就是前缀和数组的最后一个数(lastVal)然后我们以lastVal为上界生成一个随机整数,也就是说整数的范围是[0,lastVal - 1]对于生成的某个整数n,我们去寻找前缀和数组中比n大的最小的数class Solution { int[] sums; Random random; public Soluti

系统通知整理_Philm_iOS的博客-程序员宝宝

系统通知整理//7.0// Developer/Library/Frameworks/SenTestingKit.framework/Headers/SenTestCaseRun.hSENTEST_EXPORT NSString * const SenTestCaseDidStartNotification;SENTEST_EXPORT NSString * const SenT...

pythonwhile输出每一个余数_Python学习(5)(while循环语句、循环嵌套、break/continue、赋值运算符、转义字符等 )..._weixin_39946274的博客-程序员宝宝

Python学习(5)一、python的while 循环语句二、python的赋值运算符三、python的while 循环语句 示例四、python的 break 和 continue五、python的while 嵌套1、用嵌套打印小星星2、python 九九乘法表六、python的print 函数的补充(不自动换行)七、python的字符串中的转义字符程序的三大流程顺序----从上向下,顺序执行...

you-get 下载视频_划船的使者的博客-程序员宝宝

you-get https://www.youtube.com/watch?v=afRS36CRwPI可直接使用命令下载视频you-get -i https://www.youtube.com/watch?v=afRS36CRwPI我们可以看到上面[DEFAULT]默认选项。一般来说,视频总是会下载清晰度最高的那个,如果你需要修改下载的清晰度,可以使用you-get --itag={NUMBER} [URL]命令。使用python调用import sysimport you_getdef

node.js如何开关守护进程_谁抢了我的网名的博客-程序员宝宝

在xshell中将pm2安装到服务器上在项目目录下,运行pm2 start node ./bin/www (此时你的启动项是node ./bin/www)或者pm2 start app.js此时表示进程已经开启,可以关掉xshell在项目目录下,运行pm2 kill此时你的项目就不能在网页上浏览了

zscore函数的数据标准化处理及MATLAB实现_爱趣无穷的博客-程序员宝宝_zscore

一、数据标准化处理在数据分析之前,我们通常需要先将数据标准化(normalization),利用标准化后的数据进行数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。数据无量纲化处理主要解决数据的可比性。数据标准化的方法:有很多种,常用的有“最小—最大标准化”、“Z-sc

随便推点

【AndroidStudio】 “错误: 程序包R不存在“,����: �����R������,乱码R乱码 的解决方法_zZnamesystem的博客-程序员宝宝_程序包r不存在

【AndroidStudio】 "错误: 程序包R不存在",����: �����R������,乱码R乱码 的解决方法

小米路由pro php,完全拆解小米路由器Pro:无接口,预加硬盘无望_weixin_39795479的博客-程序员宝宝

之前有人拆过 感觉不彻底 有人说有预留接口 可以焊接?所以抱着探索的理念 下单买了一个 到货了立刻开始拆221744xruuuxetu0rrht0h.jpg (57.44 KB, 下载次数: 10)2017-4-14 22:17 上传221744w6r1sq1mafa5s1ln.jpg (45.34 KB, 下载次数: 13)2017-4-14 22:17 上传221745fc05hhpdf0nt...

总结一下:VS2019中对C++20语言特性的支持_拓扑梅尔-漫漫开发路的博客-程序员宝宝_vs2019 支持c++20吗

有什么新东西?我们的开发团队一直都在努力工作,尝试在MSVC工具集中实现C++20尽可能多的语言特性,在已发布的VS2019 v16.7和VS2019 v16.8中,我们取得了比较大的进展。今天,我们就来总结一下这两个大版本中对C++20的支持情况。今天我们将特别关注MSVC编译器(cl.exe)中实现的C++20语言特性。有关STL相关的进展消息,我们会在Microsoft STL GitHub中进行发布。下面列出的一些特性中,有一些已经早在今年9月的举行的CppCon 2020会议中就给大家

java中的日期format如何使用_Java中SimpleDateFormat的使用方法_明明如灼的博客-程序员宝宝

本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。java.text.SimpleDateFormat 以区域语言环境敏感的方式格式化和解析日期,可以将日期格式化为指定字符串和将字符串解析成日期。java.text.SimpleDateFormat 可以根据用户定义的模式格式化日期@Testpublic void test() {Calendar calendar =...

看完这篇后,别再说你不懂JVM类加载机制了~_Java知音_的博客-程序员宝宝

精彩推荐一百期Java面试题汇总SpringBoot内容聚合IntelliJ IDEA内容聚合Mybatis内容聚合Class类文件的结构任何一个Class文件都对应着唯一一个类或接口的...

恶灵传说之老程序员_机器学习算法与人工智能的博客-程序员宝宝

序这则故事写于1998年1月,爱沙尼亚,塔图。是将我在当地日常工作经历和爱沙尼亚一个民间传说融合改编而成。当时我们做了大量的系统分析,因此故事中提到了CASE工具和图表。不像今天的办公室那般宽敞,当时的办公场所十分拥挤,而且我们真的常常熬夜加班然后在办公室睡袋里过夜。甚至有人会电击别人。趣事很多,容我慢慢道来……一个老程序员这家伙是晚上被带到公司的。“他们把你招收进来了?”一个程序员问,“估计是把

推荐文章

热门文章

相关标签