std::Map

Posted osbreak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std::Map相关的知识,希望对你有一定的参考价值。

Map是STL的一个关联容器,它提供一对一的数据处理能力.
map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

 

map的构造函数:供了6个构造函数

 

数据插入

技术分享图片
mapStudent.insert(pair<int, string>(1, “student_one”));
mapStudent.insert(map<int, string>::value_type (1, “student_one”));
Map<int, string> mapStudent;mapStudent[1] =  “student_one”;

当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念。
insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值。
insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,程序如下
Pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, “student_one”));
我们通过pair的第二个变量来知道是否插入成功.
View Code

 

数据的遍历

技术分享图片
数据的遍历
这里也提供三种方法,对map进行遍历
第一种:应用前向迭代器,for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
第二种:应用反相迭代器,for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
第三种:用数组方式 int nSize = mapStudent.size();for(int nIndex = 1; nIndex <= nSize; nIndex++) 
View Code

 

数据的查找(包括判定这个关键字是否在map中出现)

技术分享图片
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,
由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器.
第三种:这个方法用来判定数据是否出现,
Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
View Code

 

数据的清空与判空

技术分享图片
清空map中的数据可以用clear()函数,
判定map中是否有数据可以用empty()函数,
数据的删除
mapStudent.erase(iter);
Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0
mapStudent.earse(mapStudent.begin(), mapStudent.end());//成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
View Code

 

排序

技术分享图片
这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,
以上代码在排序上是不存在任何问题的,
因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,
因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题
#include <map>
#include <string>
Using namespace std;
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;  //学生信息
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));
}
View Code

 

以上是关于std::Map的主要内容,如果未能解决你的问题,请参考以下文章

将 std::map 转换为有序的 std::vector

在 std::map 中搜索时堆栈溢出

std::unordered_map::clear() 做啥?

具有结构错误值的 std::map

锁定 std::map C++

C++代码中map的find函数问题