c++ map、multimap 的使用方法

2023-11-05

 

一、

Map是c++的一个标准容器,它提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!
1. map构造函数;
map<string , int >mapstring; map<int ,string >mapint;
map<sring, char>mapstring; map< char ,string>mapchar;
map<char ,int>mapchar; map<int ,char >mapint;

如在打枚举中打印 “指定值对应的字符串”时,可是采用map<int, string>的STL实现。

以前我们是这样打印信息出来的:

static inline const char * 
VNET_TYPE_STRING(vnet_type_t type)
{
    static VALUE_STRING_STRUCT g_type_string[] =
    {
        { VNET_TYPE_UNKOWN, "unkown1" },
        { VNET_TYPE_SOCKET, "socket" },
        { VNET_TYPE_RDP,    "rdp" },
        { VNET_TYPE_PCOIP,  "pcoip" },
        { VNET_TYPE_ICA, "ica" },
		{ VNET_TYPE_XRED, "xred" },
        { 0, NULL },
    };
    return GetValueString(g_type_string, (ULONG)type);
}
static inline const TCHAR *
GetValueString(VALUE_STRING_STRUCT *vsarray, ULONG value)
{
    VALUE_STRING_STRUCT *tmp = vsarray;

    while ( tmp->string != NULL )
    {
        if ( tmp->value == value )
        {
            return tmp->string;
        }
        tmp++;
    }
    return _T("unkown");
}



 

2. map添加数据;
map<int ,string> maplive;
1.maplive.insert(pair<int,string>(102,"aclive"));
2.maplive.insert(map<int,string>::value_type(321,"hai"));
3, maplive[112]="April";//map中最简单最常用的插入添加!

3,map中元素的查找:

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

map<int ,string >::iterator l_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"we do not find 112"<<endl;
else cout<<"wo find 112"<<endl;


4,map中元素的删除:
如果删除112;
map<int ,string >::iterator l_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"we do not find 112"<<endl;
else maplive.erase(l_it); //delete 112;

 


5,map中 swap的用法
Map中的swap不是一个容器中的元素交换,而是两个容器交换

For example:

#include <map>
#include <iostream>

using namespace std;


int main( )
{
	map <int, int> m1, m2, m3;
	map <int, int>::iterator m1_Iter;

	m1.insert ( pair <int, int> ( 1, 10 ) );
	m1.insert ( pair <int, int> ( 2, 20 ) );
	m1.insert ( pair <int, int> ( 3, 30 ) );
	m2.insert ( pair <int, int> ( 10, 100 ) );
	m2.insert ( pair <int, int> ( 20, 200 ) );
	m3.insert ( pair <int, int> ( 30, 300 ) );

	cout << "The original map m1 is:";
	for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
		cout << " " << m1_Iter->second;
	cout << "." << endl;

	// This is the member function version of swap
	//m2 is said to be the argument map; m1 the target map
	m1.swap( m2 );

	cout << "After swapping with m2, map m1 is:";
	for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
		cout << " " << m1_Iter -> second;
	cout << "." << endl;
	cout << "After swapping with m2, map m2 is:";
	for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )
		cout << " " << m1_Iter -> second;
	cout << "." << endl;
	// This is the specialized template version of swap
	swap( m1, m3 );

	cout << "After swapping with m3, map m1 is:";
	for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
		cout << " " << m1_Iter -> second;
	cout << "." << endl;

	system("pause");
}


运行结果是:

6.map的sort问题:
Map中的元素是自动按key升序排序,所以不能对map用sort函数
For example:

#include <map>
#include <iostream>

using namespace std;


int main( )
{
map <int, int> m1;
map <int, int>::iterator m1_Iter;

m1.insert ( pair <int, int> ( 1, 20 ) );
m1.insert ( pair <int, int> ( 4, 40 ) );
m1.insert ( pair <int, int> ( 3, 60 ) );
m1.insert ( pair <int, int> ( 2, 50 ) );
m1.insert ( pair <int, int> ( 6, 40 ) );
m1.insert ( pair <int, int> ( 7, 30 ) );

cout << "The original map m1 is:"<<endl;
for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
cout << m1_Iter->first<<" "<<m1_Iter->second<<endl;

}


7, map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数


二、C++中map用法

/************************************************************************
*
* Map的特点: 1、存储Key-value对
* 2、支持快速查找,查找的复杂度基本是Log(N)
* 3、快速插入,快速删除,快速修改记
*
/************************************************************************/
#include <iostream>
#include <string>
#include <map> 
using namespace std;


int main()
{
	map<const char*,int> m;
	m["a"]=1;
	m["b"]=6;
	m["c"]=9;
	map<const char*,int>::iterator it;
	it=m.begin();
	const char* c =it->first;
	cout<<"first element is :"<<c<<endl;
	int i = m["c"];
	while(it!=m.end()){
		cout << it->first<<";"<<it->second<<endl;
		++it;
	}
	cout <<"m[\"c\"]="<<i<<endl;
	cout <<"sizeof m:"<<m.size()<<endl;
	cout <<"erase m[\"c\"](1:succ 0:failed):"<<m.erase("c")<<endl;
	cout <<"erase m[\"c\"]:"<<m.erase("c")<<endl;
	cout <<"sizeof m:"<<m.size()<<endl;
	cout<<"m[c]="<<m["c"]<<endl;
	cout<<"sizeof m :"<<m.size()<<endl;

	system("pause");
	return 0;

}


 

请注意上面打感叹号的地方,map的大小因此调用了“cout<<"m[c]="<<m["c"]<<endl;”而增加了1个。这点真的另人很奇怪。!!!!

 

 

三、multimap 的使用方法

 

/*
 *
 ********************************************
 *  multimap多重映照容器的基础说明:
 ********************************************
 *
 * multimap多重映照容器:容器的数据结构采用红黑树进行管理
 * multimap的所有元素都是pair:第一元素为键值(key),不能修改;第二元素为实值(value),可被修改
 *
 * multimap特性以及用法与map完全相同,唯一的差别在于:
 * 允许重复键值的元素插入容器(使用了RB-Tree的insert_equal函数) 
 * 因此:
 * 键值key与元素value的映照关系是多对多的关系
 * 没有定义[]操作运算 
 * 
 * Sorted Associative Container  Pair Associative Container   Unique Associative Container
 *
 * 使用multimap必须使用宏语句#include <map>          
 *
 **************************************************************************************
 *
 * 创建multimap对象:
 * 1.multimap<char,int,greater<char> > a;    //元素键值类型为char,映照数据类型为int,键值的比较函数对象为greater<char>
 * 2.multimap(const key_compare& comp)     //指定一个比较函数对象comp来创建map对象
 *  3.multimap(const multisetr&);      //multimap<int,char*> b(a); //此时使用默认的键值比较函数less<int>
 * 4.multimap(first,last);         
 * 5.multimap(first,last,const key_compare& comp);  
 *
 * //Example:
 * pair<const int ,char> p1(1,'a');
 * pair<const int ,char> p2(2,'b');
 * pair<const int ,char> p3(3,'c');
 * pair<const int ,char> p4(4,'d');
 * pair<const int ,char> pairArray[]={p1,p2,p3,p4};
 * multimap<const int,char> m4(pairArray,pairArray+5);
 * multimap<const int,char> m3(m4);
 * multimap<const int,char,greater<const int> > m5(pairArray,pairArray+5,greater<const int>());
 *
 **************************************************************************************
 *
 * 元素的插入
 * //typedef pair<const key,T> value_type;
 * pair<iterator,bool> insert(const value_type& v);    
 * iterator insert(iterator pos,const value_type& v);
 * void insert(first,last);
 *
 **************************************************************************************
 *
 * 元素的删除
 * void erase(iterator pos);
 * size_type erase(const key_type& k);     //删除等于键值k的元素
 * void erase(first,last);        //删除[first,last)区间的元素
 * void clear();
 *
 **************************************************************************************
 *
 * 访问与搜索
 *
 * iterator begin();iterator end();     //企图通过迭代器改变元素是不被允许的
 * reverse_iterator rbegin();reverse_iterator rend();
 *
 * iterator find(const key_type& k) const;
 * pair<iterator,iterator> equal_range(const key_type& k) const;//返回的pair对象,
 *                //first为lower_bound(k);大于等于k的第一个元素位置
 *                //second为upper_bound();大于k的第一个元素位置
 *
 * 其它常用函数
 * bool empty() const;
 * size_type size() const;
 * size_type count(const key_type& k) const;   //返回键值等于k的元素个数
 * void swap();
 *
 * iterator lower_bound();iterator upper_bound();pair<iterator,iterator> equal_range();//上界、下届、确定区间
 *
 *
 *
 ********************************************
 **   cumirror ** tongjinooo@163.com **    **
 ********************************************
 *
 */

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

// 基本操作与set类型,牢记map中所有元素都是pair
// 对于自定义类,初学者会觉得比较函数如何构造很麻烦,这个可以参照前面的书写示例
// 但若设置键值为int或char类型,无须构造比较函数

struct student{
 char* name;
 int age;
 char* city;
 char* phone;
};

int main()
{
	 using namespace std;

	 student s[]={
	  {"童进",23,"武汉","XXX"},
	  {"老大",23,"武汉","XXX"},
	  {"饺子",23,"武汉","XXX"},
	  {"王老虎",23,"武汉","XXX"},
	  {"周润发",23,"武汉","XXX"},
	  {"周星星",23,"武汉","XXX"}
	 };
	  pair<int,student> p1(4,s[0]);
	  pair<int,student> p2(2,s[1]);
	  pair<int,student> p3(3,s[2]);
	  pair<int,student> p4(4,s[3]);  //键值key与p1相同
	  pair<int,student> p5(5,s[4]);
	  pair<int,student> p6(6,s[5]);
	 multimap<int,student> a;
	 a.insert(p1);
	 a.insert(p2);
	 a.insert(p3);
	 a.insert(p4);
	 a.insert(p5);
	 a.insert(p6);
	 typedef multimap<int,student>::iterator int_multimap;
	 pair<int_multimap,int_multimap> p = a.equal_range(4);
	 int_multimap i = a.find(4);
	 cout<<"班上key值为"<< i->first<<"的学生有:"<<a.count(4)<<"名,"<<"   他们是:"<<endl;
	 for(int_multimap k = p.first; k != p.second; k++)
	 {
		cout<<k->second.name<<endl;
	 }
	 cout<<"删除重复键值的同学"<<endl;
	 a.erase(i);
	 cout<<"现在班上总人数为:"<<a.size()<<".   人员如下:"<<endl;
	 for(multimap<int,student>::iterator j=a.begin(); j != a.end(); j++)
	 {      
		  cout<<"The name: "<<j->second.name<<"      "<<"age: "<<j->second.age<<"   "
		   <<"city: "<<j->second.city<<"      "<<"phone: "<<j->second.phone<<endl;
	 }

	 return 0;
}


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ map、multimap 的使用方法 的相关文章

  • CComModule类

    该类是一个COM服务器模块 允许一个客户端访问当前模块的组件 CComModule支持DLL和EXE模块 备注 Windows CE的ATL并不支持下面标准ATL的CComModule类方法 CComModule RegisterClass
  • VC编译的五子棋游戏核心算法分析(附源码)

    转载请标明是引用于 http blog csdn net chenyujing1234 前段时间在CSDN的资源里载得五子棋VC的源码 由于忘了链接地址 这里没有标明出处 请作者谅解 但我也把在VS2005上编译通过且加入清楚的注释的源码放
  • SetTimer在无窗口和有窗口线程的使用 .

    今天犯了一个粗心的错误 在无窗口线程中 SetTimer中设置计时器ID 而WM TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID 111902 cpp Defines the entry point for the co
  • Web网页中内嵌Activex的Activex插件开发

    转载自 http blog csdn net tttyd article details 5258096 源代码下载 http files cnblogs com tttyd Activex rar 由于在博主的博客中没有讲明工程的创建过程
  • 可连接点对象及示例(一)

    转载请标明是引用于 http blog csdn net chenyujing1234 参考书本 EVC高级编程及其应用开发 客户是主动的 而组件是被动的 组件通过自身暴露给客户的接口来监听客户请求 一旦接收到客户请求便宜做出反应 这样的接
  • 游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写 转载请注明出处 http blog csdn net zhmxy555 article details 7405479 作者 毛星云 邮箱 happylifemxy qq com 欢迎邮件交流编程心得 上一
  • WCE下创建MFC的COM对象及使用方法(一)

    转载请标明是引用于 http blog csdn net chenyujing1234 平台 VS2005 MIPSSDK 例子代码 http www rayfile com zh cn files 7020e9b8 7240 11e1 b
  • 用ATL写简单的ActiveX控件

    我正在做的项目需要用读卡器来读数据 由于系统是B S架构的 所以只能把读卡器的驱动封装成一个无界面的ActiveX控件 这样web页面中的js代码才能访问读卡器 其实做起来也挺简单的 我用的环境是VS2005 步骤如下 打开VS2005后
  • COM三大接口:IUnknown、IClassFactory、IDispatch

    转载自 http blog sina com cn s blog 86d10dc701014m2v html 1 COM组件有三个最基本的接口类 分别是IUnknown IClassFactory IDispatch 1 1 COM规范规定
  • COM读书笔记---- 编程工作的简化

    参考书籍 lt
  • 非printf形式打印各种数据类型的十六进制和二进制

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 一 源码实现 为了适配各种数据类型 且可以通过sizeof得到此类型的大小 所以这里采用模板形式开发 以下是实现此功能的源码
  • ATL与COM之间的关系、ATL的特点与基本使用方法

    ATL Active Template Library活动模板库 是一种微软程序库 支持利用C 语言编写ASP代码以及其它ActiveX程序 通过活动模板库 可以建立COM组件 然后通过ASP页面中的脚本对COM对象进行调用 这种COM组件
  • FindWinow

    1 MFC中的Caption属性就是windowName属性
  • DLL注入技术

    转载自 http hi baidu com xwind85 blog item ae5332ad04bb7f034a36d662 html 一 DLL注入技术的用途 DLL注入技术的用途是很广泛的 这主要体现在 1 假如你要操纵的对象涉及的
  • C#开发-----百变方块游戏

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 http www rayfile com zh cn files b6ed0bc0 8e9e 11e1 8178 0015c55db73d n
  • 在ActiveX控件中如何动态调用DLL函数

    刚到公司不久 接到领导的下达的一个任务 就是把对POS机操作功能封装在ActiveX控件中 在IE中调用 这样就能实现在IE上直接对POS机进行操作 而我要封装的这个动态库 厂家只提供了一个单的动态库和一百多字的说明 也就是说明一下动态库中
  • 【Visual C++】游戏开发笔记二十二 游戏基础物理建模(四) 粒子系统模拟(一)

    本系列文章由zhmxy555 毛星云 编写 转载请注明出处 http blog csdn net zhmxy555 article details 7585937 作者 毛星云 邮箱 happylifemxy qq com 期待着与志同道合
  • VS2005下MFC开发的ActiveX控件的部分总结 inf 篇

    本博客转载CSDN网友http blog csdn net immc1979 archive 2007 04 20 1572222 aspx 本人觉得写得非常的实在 一看就是从实际经验中总结出来的 借鉴了 感谢immc1979 虽然微软对A
  • 可连接点对象及示例(二)

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 包括客户端与服务端 http www rayfile com zh cn files de82908f 7309 11e1 9db1 0015
  • 采用ATL模型代替lib dll 的调用

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 为WCE SDK下的例子 转为win32 自己移植 http www rayfile com zh cn files c638241c df8

随机推荐

  • Vue中的侦听器:数据变化的秘密揭示

    一 侦听器 vue中想监听数据的变化 一 侦听器watch 如何侦听到某个变量值改变呢 使用watch配置项 watch 可以侦听到data computed属性值的改变 语法 watch 被侦听的属性名 newVal oldVal 快速入
  • 2021全国职业技能大赛-网络安全赛题解析———防火墙篇iptables(超详细)

    2021全国职业技能大赛 网络安全赛题解析 防火墙篇 模块A防火墙的基本规则操作 什么是防火墙 iptables 有问题私信博主 模块A防火墙的基本规则操作 什么是防火墙 iptables IPTABLES 是与最新的 3 5 版本 Lin
  • 2021Robocom决赛---账户安全预警

    拼题 A 系统为提高用户账户的安全性 打算开发一个自动安全预警的功能 对每个账户的每次登录 系统会记录其登录的 IP 地址 每隔一段时间 系统将统计每个账户从多少不同的 IP 地址分别登录了多少次 如果某个账户的登录 IP 超过了 TIP
  • Python如何将字符串(str/json)转换字典(dict)

    一 字符串str转为字典dict 1 使用json进行转换 import json a a 1 b 1 c json loads a print c type c 输出 a 1 c 1
  • GraphQL 中文 -- 一份不标准不专业的翻译

    请移步我的 Github 查看翻译 如有翻译不恰当的地方欢迎指正
  • python 实现GUI(图形用户界面)编程

    Python支持多种图形界面的第三方库 包括 wxWidgets Qt GTK Tkinter Tkinter 模块 Tk 接口 是 Python 的标准 Tk GUI 工具包的接口 Tk 和 Tkinter 可以在大多数的 Unix 平台
  • Springboot整合Swagger2(3.0.0版本)

    天行健 君子以自强不息 地势坤 君子以厚德载物 每个人都有惰性 但不断学习是好好生活的根本 共勉 文章均为学习整理笔记 分享记录为主 如有错误请指正 共同学习进步 文章目录 Swagger2简介 开发环境 实现步骤说明 1 搭建项目 2 引
  • JxBrowser Java浏览器控件

    关键字 JxBrowser能在Windows Linux Mac OS X Intel and PPC based 平台上将Mozilla Firefox浏览器完美地整合到Java AWT Swing应用程序里 该库程序使用Gecko设计引
  • win7/win10电脑屏幕录像工具?

    目前windows系统中 windows 7系统是没有自带的录屏软件 windows 10系统也是对电脑型号有要求 所以在录屏的时候 就需要通过其他三方工具去处理 下载安装 一款优质录屏软件可以给我们的工作以及生活带来不少的便捷 QVE屏幕
  • linux 查看定时任务

    输入cd var spool cron命令 输入ls命令列出cron目录下的定时任务 vi 查看
  • 强制tensorflow使用cpu

    one start import tensorflow as tf cpu tf config list physical devices CPU tf config set visible devices cpu print tf con
  • Java 中SimpleDateFormat类的使用

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 SimpleDateFormat类的介绍 SimpleDateFormat类是一个具体的类 用于以区域设置敏感的方式格式化和解析日期 日
  • VirtualAPK 详解和使用,真牛

    3 1 基本原理 合并宿主和插件的ClassLoader 需要注意的是 插件中的类不可以和宿主重复 合并插件和宿主的资源 重设插件资源的packageId 将插件资源和宿主资源合并 去除插件包对宿主的引用 构建时通过Gradle插件去除插件
  • jeesite整合单点登录

    1 什么是单点登录 单点登录SSO Single Sign On 实际上就是用户在一个系统登录之后 在单点登录的其他客户端 应用 不用重复的登陆 登陆校验交给中央认证服务器去校验 单点登录的应用场景通常为一个大型的系统下有很多小系统 并且这
  • 数据结构之双链表(c语言附完整代码)

    文章目录 一 定义 二 基本运算 三 完整代码 一 定义 双向链表也叫双链表 是链表的一种 它的每个数据结点中都有两个指针 分别指向直接后继和直接前驱 所以 从双向链表中的任意一个结点开始 都可以很方便地访问它的前驱结点和后继结点 示意图
  • Confluence 7 如何修改启动内存

    和 Java 有关的项目通常和内存都有关 最近我们的 Confluence 平台经常挂起 通常的原因可能是内存溢出 在对 Confluence 进行调整之前 需要先查看下内存的配置情况 内存信息 在 Confluence 中 你可以查看当前
  • 【Java】垃圾回收

    目录 概述 什么是垃圾 Garbage 想要学习GC 首先需要理解为什么需要GC Java 垃圾回收机制 Java自动内存管理的优点 关于自动内存管理的担忧 GC 的作用区域 垃圾回收相关算法 重要 标记阶段 引用计数器算法和可达性分析算法
  • Dino 404

    未压缩的版本 可在此处改写 然后到https tool lu html 进行压缩
  • 人大金仓解决授权文件license过期问题

    错误描述 FATAL license file expired 查询授权文件过期时间 SELECT GET LICENSE VALIDDAYS 如果过期了需要替换 license 文件 从官网下载企业版或者专业版授权文件 官网下载地址 li
  • c++ map、multimap 的使用方法

    一 Map是c 的一个标准容器 它提供了很好一对一的关系 在一些程序中建立一个map可以起到事半功倍的效果 总结了一些map基本简单实用的操作 1 map构造函数 map