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. 2、map添加数据
  5. mapStudent.insert(pair<int, string>(1, "student_one"));
  6. mapStudent.insert(map<int, string>::value_type(2, "student_two"));
  7. mapStudent[3] = "student_three";
  8. ********************************************************************/
  9. #pragma warning (disable:4786)
  10. #include <map>
  11. #include <string>
  12. #include <iostream>
  13. using namespace std;
  14. int main()
  15. {
  16. map<int, string> mapStudent;
  17. cout<<"三种插入方式:"<<endl;
  18. mapStudent.insert(pair<int, string>(1, "student_one"));
  19. mapStudent.insert(map<int, string>::value_type(2, "student_two"));
  20. mapStudent[3] = "student_three";
  21. mapStudent.insert(map<int, string>::value_type(4, "student_four"));
  22. pair<map<int,string>::iterator,bool> InsertPair;   //判断是否插入成功
  23. InsertPair = mapStudent.insert(map<int,string>::value_type(5,"student_five"));
  24. if(InsertPair.second == true)
  25. {
  26. //cout<<InsertPair.first.operator++<<endl;  //求解??不知道怎么应用第一个数据
  27. }
  28. cout<<"三种遍历方式:"<<endl;
  29. map<int, string>::iterator  iter;
  30. for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  31. {
  32. cout<<iter->first<<" "<<iter->second<<endl;
  33. }
  34. map<int, string>::reverse_iterator  iters;
  35. for(iters = mapStudent.rbegin(); iters != mapStudent.rend(); iters++)
  36. {
  37. cout<<iters->first<<" "<<iters->second<<endl;
  38. }  //逆序输出
  39. cout<<"数组的输出形式:"<<endl;
  40. for(int iIndex=0;iIndex < mapStudent.size();iIndex++) //size()返回成员的个数
  41. {
  42. cout<<mapStudent[iIndex]<<endl;
  43. }
  44. cout<<mapStudent.count(1)<<endl;  //count()判断关键字是否存在,返回1表示存在,0
  45. iter = mapStudent.find(1);        //find()关键字存在时,返回数据所在位置的迭代器,否则返回end()返回的迭代器
  46. if( iter != mapStudent.end() )
  47. {
  48. cout<<"数据存在:"<<iter->first<<" "<<iter->second<<endl;
  49. mapStudent.erase(iter);        //用迭代删除数据
  50. }
  51. else
  52. {
  53. cout<<"数据不存在!"<<endl;
  54. }
  55. int n = mapStudent.erase(3);        //用关键字删除,如果删除了会返回1,否则返回0
  56. iter = mapStudent.lower_bound(2);   //返回2的迭代器
  57. cout<<iter->second<<endl;
  58. iter = mapStudent.upper_bound(2);   //返回3的迭代器
  59. cout<<iter->second<<endl;
  60. /*Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字*/
  61. pair<map<int,string>::iterator,map<int,string>::iterator> MapPair;
  62. MapPair = mapStudent.equal_range(2);
  63. if( MapPair.first == MapPair.second )
  64. {
  65. cout<<"Do not find"<<endl;
  66. }
  67. else
  68. {
  69. cout<<"Find"<<endl;
  70. }
  71. //删除一个前闭后开的集合,这是STL的特性
  72. mapStudent.earse(mapStudent.begin(), mapStudent.end());
  73. }

c++ STL map 结构体的更多相关文章

  1. map 结构体

    map<node,int> 需要运算符重载< 请注意,不同的node,请务必让它们可以区分出来(node a,b a<b or b<a) 如 node { int a,i ...

  2. L2-002. 链表去重(map结构体,精彩的代码)

    链表去重 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值 ...

  3. stl实现结构体排序关键语法要点(sort)

    sort函数,调用时使用函数头: #include <algorithm> sort(begin,end);用来表示一个范围. int _tmain(int argc, _TCHAR* a ...

  4. STL map、set中key为结构体的用法

    下面是map定义的结构: // TEMPLATE CLASS map template<class _Kty, class _Ty, class _Pr = less<_Kty>, ...

  5. CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)

    User-Defined Data Types in Messages(用户自定义类型)All user-defined types must be explicitly “announced” so ...

  6. map中结构体做关键字的注意事项

    序: 今天做一道题,由于递归函数比较恶心,如果用记忆化搜索,数据范围极大却又用不全(二维数组存的话直接炸).所以决定干脆使用stl::map存储(反正有O2优化),但是执行insert的时候,编译器却 ...

  7. 结构体作为map的key或放入set中,需要重载<运算符

    结构体作为map的key或放入set中,需要重载<运算符,如下: typedef struct tagRoadKey{    int m_i32Type;    int m_i32Scale; ...

  8. std::map使用结构体自定义键值

    使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...

  9. 用set、map等存储自定义结构体时容器内部判别各元素是否相同的注意事项

    STL作为通用模板极大地方便了C++使用者的编程,因为它可以存储任意数据类型的元素 如果我们想用set与map来存储自定义结构体时,如下 struct pp { double xx; double y ...

随机推荐

  1. Inno Setup入门(四)——为程序创建桌面快捷方式

    Icons这一可选段定义所有创建在开始菜单和\或其它位置 (比如桌面) 的快捷方式.一个例子如下: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TEST De ...

  2. java非web应用修改 properties/xml配置文件后,无需重启应用即可生效---自动加载

    实现时主要使用Commons-Configuration.jar包,还需要commons-lang,disgestor,beanutils,collections等, package propFile ...

  3. 编程实践笔记{Java 线程 并发处理 Webservice}(转)

    http://www.cnblogs.com/mingzi/archive/2009/03/09/1406694.html 1, 保证线程安全的三种方法: a, 不要跨线程访问共享变量 b, 使共享变 ...

  4. 自动化安装smokeping-2.6.11脚本

    自动化安装Smokeping-2.6.11脚本 一.目的 1.1 监控目的 为方便监测各数据中心网络状况,自定义全国各节点,从而发现网络异常,判断网络故障. 1.2 本文目的 快速部署Smokepin ...

  5. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  6. Less入门与安装(转)

    快速入门 Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. Less 可以运行在 Node.浏览 ...

  7. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  8. Inondb中的checkpoint

    checkpoint主要是为了解决一下问题: 1.缩短数据库的恢复时间 2.缓冲池不够用时,将脏页刷新到磁盘 3.重做日志不可用时,刷新脏页 Innodb引擎使用LSN(log sequence nu ...

  9. linux 文件系统 xfs、ext4、ext3 的区别

    前言 centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 ext3介绍 ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时 ...

  10. Python 文件 isatty() 方法

    概述 Python 文件 isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False. 语法 isatty() 方法语法如下: fileObject.isatty ...