c++ STL map 结构体

杂记1:正向反向迭代器,不同stl容器的lower_bound的使用(set,map,vector,arr,pair),数字转字符串 感觉自己记性真的不行,很多之前用过,查过的知识点都忘掉了,开个博客记一下吧。 文章目录迭代器lower_bound,upper_bound可以忽略,我暂时没发现用处这个比较有用:不同容器的lower_boundpair+lower_bound 迭代器 基本格式: 容器类名::iterator 迭代器名; 举两个例子 vector<int>::iterator ite; map<int,int>::iterator ite; 迭代器又分四种,常用的是正向迭代器(上面那个)和反 阅读详情

点击打开链接

点击打开链接

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题

第一种:小于号重载,程序举例

#include <map>

#include <string>

Using namespace std;

Typedef struct tagStudentInfo

{

       Int      nID;

       String   strName;

}StudentInfo, *PStudentInfo;  //学生信息

 

Int main()

{

    int nSize;

       //用学生信息映射分数

       map<StudentInfo, int>mapStudent;

    map<StudentInfo, int>::iterator iter;

       StudentInfo studentInfo;

       studentInfo.nID = 1;

       studentInfo.strName = “student_one”;

       mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));

       studentInfo.nID = 2;

       studentInfo.strName = “student_two”;

mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));

 

for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)

    cout<<iter->first.nID<<endl<<iter->first.strName<<endl<<iter->second<<endl;

 

}

以上程序是无法编译通过的,只要重载小于号,就OK了,如下:

Typedef struct tagStudentInfo

{

       Int      nID;

       String   strName;

       Bool operator < (tagStudentInfo const& _A) const

       {

              //这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序

              If(nID < _A.nID)  return true;

              If(nID == _A.nID) return strName.compare(_A.strName) < 0;

              Return false;

       }

}StudentInfo, *PStudentInfo;  //学生信息

第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明

#include <map>

#include <string>

Using namespace std;

Typedef struct tagStudentInfo

{

       Int      nID;

       String   strName;

}StudentInfo, *PStudentInfo;  //学生信息

 

Classs sort

{

       Public:

       Bool operator() (StudentInfo const &_A, StudentInfo const &_B) const

       {

              If(_A.nID < _B.nID) return true;

              If(_A.nID == _B.nID) return _A.strName.compare(_B.strName) < 0;

              Return false;

       }

};

 

Int main()

{

       //用学生信息映射分数

       Map<StudentInfo, int, sort>mapStudent;

       StudentInfo studentInfo;

       studentInfo.nID = 1;

       studentInfo.strName = “student_one”;

       mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));

       studentInfo.nID = 2;

       studentInfo.strName = “student_two”;

mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));

}

  1. /****************************************************************** 
  2.       map的基本操作函数: 
  3.       C++ Maps是一种关联式容器,包含“关键字/值”对 
  4.       begin()          返回指向map头部的迭代器 
  5.       clear()         删除所有元素 
  6.       count()          返回指定元素出现的次数 
  7.       empty()          如果map为空则返回true 
  8.       end()            返回指向map末尾的迭代器 
  9.       equal_range()    返回特殊条目的迭代器对 
  10.       erase()          删除一个元素 
  11.       find()           查找一个元素 
  12.       get_allocator()  返回map的配置器 
  13.       insert()         插入元素 
  14.       key_comp()       返回比较元素key的函数 
  15.       lower_bound()    返回键值>=给定元素的第一个位置 
  16.       max_size()       返回可以容纳的最大元素个数 
  17.       rbegin()         返回一个指向map尾部的逆向迭代器 
  18.       rend()           返回一个指向map头部的逆向迭代器 
  19.       size()           返回map中元素的个数 
  20.       swap()            交换两个map 
  21.       upper_bound()     返回键值>给定元素的第一个位置 
  22.       value_comp()      返回比较元素value的函数
  1. ==================================================================== 
  2. 1、map构造 
  3.     map<int, string> mapStudent; 
  4.  
  5. 2、map添加数据 
  6.     mapStudent.insert(pair<int, string>(1, "student_one")); 
  7.     mapStudent.insert(map<int, string>::value_type(2, "student_two")); 
  8.     mapStudent[3] = "student_three"; 
  9.  
  10. ********************************************************************/  
  11. #pragma warning (disable:4786)  
  12. #include <map>  
  13. #include <string>  
  14. #include <iostream>  
  15.   
  16. using namespace std;  
  17.   
  18. int main()  
  19. {  
  20.     map<int, string> mapStudent;  
  21.     cout<<"三种插入方式:"<<endl;  
  22.   
  23.     mapStudent.insert(pair<int, string>(1, "student_one"));  
  24.     mapStudent.insert(map<int, string>::value_type(2, "student_two"));  
  25.     mapStudent[3] = "student_three";  
  26.     mapStudent.insert(map<int, string>::value_type(4, "student_four"));     
  27.       
  28.     pair<map<int,string>::iterator,bool> InsertPair;   //判断是否插入成功  
  29.     InsertPair = mapStudent.insert(map<int,string>::value_type(5,"student_five"));  
  30.     if(InsertPair.second == true)  
  31.     {  
  32.         //cout<<InsertPair.first.operator++<<endl;  //求解??不知道怎么应用第一个数据  
  33.     }  
  34.   
  35.     cout<<"三种遍历方式:"<<endl;  
  36.   
  37.     map<int, string>::iterator  iter;  
  38.     for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  39.     {  
  40.         cout<<iter->first<<" "<<iter->second<<endl;  
  41.     }  
  42.   
  43.     map<int, string>::reverse_iterator  iters;  
  44.     for(iters = mapStudent.rbegin(); iters != mapStudent.rend(); iters++)  
  45.     {  
  46.         cout<<iters->first<<" "<<iters->second<<endl;  
  47.     }  //逆序输出  
  48.     cout<<"数组的输出形式:"<<endl;  
  49.     for(int iIndex=0;iIndex < mapStudent.size();iIndex++) //size()返回成员的个数  
  50.     {  
  51.         cout<<mapStudent[iIndex]<<endl;  
  52.     }  
  53.     cout<<mapStudent.count(1)<<endl;  //count()判断关键字是否存在,返回1表示存在,0  
  54.     iter = mapStudent.find(1);        //find()关键字存在时,返回数据所在位置的迭代器,否则返回end()返回的迭代器  
  55.     if( iter != mapStudent.end() )  
  56.     {  
  57.         cout<<"数据存在:"<<iter->first<<" "<<iter->second<<endl;  
  58.         mapStudent.erase(iter);        //用迭代删除数据  
  59.     }  
  60.     else  
  61.     {  
  62.         cout<<"数据不存在!"<<endl;  
  63.     }  
  64.     int n = mapStudent.erase(3);        //用关键字删除,如果删除了会返回1,否则返回0  
  65.   
  66.     iter = mapStudent.lower_bound(2);   //返回2的迭代器  
  67.     cout<<iter->second<<endl;  
  68.     iter = mapStudent.upper_bound(2);   //返回3的迭代器  
  69.     cout<<iter->second<<endl;      
  70.   
  71.     /*Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字*/  
  72.     pair<map<int,string>::iterator,map<int,string>::iterator> MapPair;  
  73.     MapPair = mapStudent.equal_range(2);  
  74.     if( MapPair.first == MapPair.second )  
  75.     {  
  76.         cout<<"Do not find"<<endl;  
  77.     }  
  78.     else  
  79.     {  
  80.         cout<<"Find"<<endl;  
  81.     }  
  82.   
  83.     //删除一个前闭后开的集合,这是STL的特性  
  84.     mapStudent.earse(mapStudent.begin(), mapStudent.end());      
  85. }

C++ map以自定义数据类型做键值 前言 作者最近在项目开发中遇到一个问题,想采用自定义的结构体作为键值,但是无论怎样,就连编译都不能通过,针对这个问题,作者就开始寻求解决的办法.。终于这个问题得以解决,高兴之余,决定写个例子,供大家参考 1.map在STL中的定义 template, class A = allocator > 第一个参数 Key: map的关键字类型 第二个参数T:      map的值类型 第 阅读详情

相关推荐

C++中的map可以使用结构体作为键值吗?

在上面的代码中,我们定义了一个Person结构体,其中有两个成员变量name和age。然后,我们定义了一个map对象persons,它的键值类型是Person,值类型是int。需要注意的是,在使用结构体作为键值时,需要实现小于号运算符(operator

James_CODER的博客 825

c++ map中key为结构体

map中key为结构体 项目中需要将结构体作为hash的key,一开始用hash_map,但是结构体中多值比较一直失败,所以尝试了map。 hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。hash还有hash函数的耗时。当有100w条记录的时候,map也只需要20次的比较,200w也只需要21次的比较!所以并不一定常数就比log(n) 小。 hash_map对空间的要求要比map高很多,所以是以空间换时间的方法,而且,hash_m

qq_34462436的博客 3558

sap外币重估流程图_SAP 外币评估方法(Valuation Method,评估方法)

在FI-GL模块评估外币时(T-code:F.05),需要输入ValuationMethod。下面分解一下评估方法是如何定义的。IMG -> FI -> General LedgerAccounting ->Business Transactions ->Closing ->Valuating -> ForeignCurrency Valuation ->...

weixin_39640543的博客 2356

C++字符串切分: split实现

std::vector split(const std::string& s, const std::string& delim) { std::vector elems; size_t pos = 0; size_t len = s.length(); size_t delim_len = delim.length(); if (delim_len ==

yangalbert的专栏 9692

使用 CFD 仿真进行阀门性能分析:第一部分

了解如何使用 Ansys Discovery 评估阀门性能,使工程师能够设计出更好的产品。

jkh920184196的博客 3145

Infiniband互连网络概述

一、Infiniband是什么? InfiniBand(简称IB)是一种工业标准规范,它定义了一种输入/输出架构,用于计算节点、通信基础设施设备、存储和嵌入式系统的互连。操作系统可以是Linux、Windows或ESXI。 IB网络一共是五层,从第一天起,IB就被设计为提供一个端到端的解决方案,改善和加速从物理层到上层的所有协议层。 IB协议于2000年由IBTA(InfiniBand Trade Association)提出,其规定了一...

weixin_41687819的博客 5229

c++ map容器的key为结构体时如何找key

当key为结构体时,直接用find(key),或者map.value(key)会报错。就可以正常使用find和value了。

qq_43940235的博客 455

实战|验证码突破思路

漏洞成因:由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时,验证码参数值为空时绕过等。测试方法:抓包,删除验证码字段,查看是否可以成功发送抓包,正常流程下,记录验证码后的数据包,替换目标包中内容,直接发送,查看是否可以直接绕过验证码案例:Step1.输入正确账户信息和错误验证码,登录时抓包Step2.删除COOKIEStep3.客户端登陆成功。

weixin_46239998的博客 8102

C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值

它表示一个包含10个元素的【数组a】,每个【元素】都是指向int类型数据的【指针】。想要让【数组】存储【指向 int 或 char 或其他数据类型的指针】想要让【数组】存储【指向 int 或 char 或其他数据类型的指针】new int [m][n] 连续分配m。第二行代码:int (*a)[10];[m] 分散的int*数组,一共m个。从右至左,表示先算右边,再算左边。第一行代码:int* a[10];一个包含10个整数的int类型数组。[]优先级最高,先 a[]

zsssss333的博客 974

Python自动化办公:5分钟搞定钉钉群文件自动发送(附完整代码)

本文详细介绍了如何利用Python实现钉钉群文件的自动化发送。通过结合钉钉企业内部应用与群机器人API,构建了包含智能令牌管理、文件上传与消息发送的完整工作流。文章提供了可直接复用的完整代码,并分享了定时任务、目录监听等进阶实战方案,帮助职场人士高效解决重复性文件发送难题,实现办公自动化。

7z8x2c4v6b9的博客 325

剪映专业版关键帧完全教程:从原理到实战的动画必修课

关键帧是视频动画的核心原理。视频由连续静止画面(帧)构成,关键帧记录素材属性变化的起始与结束状态,中间过渡帧由软件自动计算生成。剪映专业版中,视频、音频、文本、贴纸等素材均支持关键帧动画,可调节位置、缩放、旋转、不透明度、音量等参数。操作为:在起始位置点击参数旁菱形按钮添加关键帧,移动播放头后调整参数,系统自动生成第二个关键帧。多属性可独立控制并叠加,实现放大同时淡出等复合效果。通过设定变化起点与终点,关键帧能让静止元素产生移动、缩放、淡入淡出等丰富动态,是视频剪辑从基础拼接进阶创意表达的核心技能。掌握关键

深耕计算机专业知识与技术。 2092

C++ STL 结构体作为map的键

在使用map等关联式容器时,用结构体作为键时,在用到键比较的场合时会报错,键无法比较。 比如: map每次插入新元素都需要比较键,自动排序。 map.count(key)对某一键计数。 因为键是我们自定义的,编译器找不到类似模板,无法比较。我们自己重载<运算符即可,指出我们在比较结构体时具体是比较哪个成员变量。 struct Test{ string data; int x; bool operator<(const package& tmp) con

LOG_IN_ME的博客 912

华为OD机试 - 服务中心选址(Python)

一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。先输入区域数组positions的长度n(1 ≤ n ≤ 10^5)接下来 n 行每行输入成对的left和right值,以空格隔开。输出为location。

m0_46181452的博客 282

C++中stl容器map针对结构体的查找

#include #include #include #include using namespace std; typedef struct MAPDATA { char data[128]; //map中数据 bool operator {  return a.data } }MAPDATA; int main() { map mp; stru

Never too late to study 2278

Windows环境下Ollama的本地部署方案

本文主要介绍了Windows环境下Ollama的本地部署方案,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. Windows环境安装 3. API调用示例代码

herosunly的博客 11万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

天梯赛L2口罩发放题:如何用C++ STL模拟复杂业务逻辑(map、vector、结构体实战)

本文详细解析了团体程序设计天梯赛L2口罩发放题的C++实现方法,重点介绍了如何利用STL容器(map、vector)和结构体模拟复杂业务逻辑。通过身份证验证、冷却期检查和多条件排序等实战示例,帮助开发者掌握算法竞赛中的工程化编码技巧,提升数据处理和业务模拟能力。

weixin_30566111的博客 417

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++-STL(11)-map-结构体指针作为key

map中如果要存的是结构体指针怎么做?创建时:要重载 <函数,你得告诉Map如何排序。查找时:重载==,你得告诉MAP何时相等。删除时:delete外还要置空,因为是new的。 上代码: #include <map> #include <iostream> using namespace std; struct Key { int x, y; boo...

aggie4628的专栏 1447

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

map结构体作为key值的使用

最近在使用stl中的map容器时,碰到key为结构体的情况,总结如下,以便提醒自己。 因为之前从没用结构体作为key值,也就没出现这种情况,结果报错后很崩溃看不懂 后来才知道map中的key默认是以less 所以要对结构体中 然后就可以使用了

codeswarrior的博客 5259

网易博客旧文--STL中如何在map中使用结构体作为索引

这里的关键其实就是定义结构时需要重载

XZHOUMIN的博客 474

C++ STL map key是自定义结构体或类

/// @file 1.cpp /// @brief /// @author EastonWoo /// 0.01 /// @date 2015-11-02 #include #include #include #include #include #include class CKey{ public: CKey(std::string str1, std::stri

EastonWoo的专栏 9526

STL map中key为结构体的用法

最近在使用stl中的map容器时,碰到key为结构体的情况,总结如下,以便提醒自己。 我的使用情景是,我需要根据不同的比例尺、道路类型这两个参数获取到对应的道路宽度,由于我是使用map解决这个问题的, 自然而然的就以比例尺、道路类型这两个参数为key,道路宽度为value,建立的key如下: 1 typedef struct tagRoadKey  2 { 3     int nTy

Mrknowledge 1125
上一篇: c++ map<string,string>
下一篇: 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Lemoneasy
博客等级 码龄17年 11粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值