1. map是一种关联容器,存储相结合形成的一个关键值和映射值的元素。它的值类型为 pair<const Key, Data>
2. 数据插入:
用insert函数插入pair数据: map1.insert(pair<int, string>(1, “student_one”));
用insert函数插入value_type数据:mapStudent.insert(map<int, string>::value_type (1,“student_one”));
用数组方式插入数据:mapStudent[2] = “student_two”;
3. 大小:
int nSize = map1.size()
4.数据遍历
应用前向迭代器
应用反相迭代器
用数组方式
4. count():
用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
5. find():
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
6. iterator lower_bound( const key_type&key ): 返回一个迭代器,指向键值>= key的第一个元素。
iterator upper_bound( const key_type&key ):返回一个迭代器,指向键值> key的第一个元素。
equal_range函数返回一个pair,pair里面第一个变量是lower_bound返回的迭代器,pair里面第二个迭代器是upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字
7 清空与判断是否为空
清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map
8. 数据删除
用迭代器删除 map<int, string>::iterator iter;
iter = mapStudent.find(1);
mapStudent.erase(iter);
用关键字删除ntn = mapStudent.erase(1);//如果删除了会返回1,否则返回0
用迭代器范围删除 mapStudent.earse(mapStudent.begin(), mapStudent.end());
9. 排序
关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题
第一种:小于号重载,程序举例
#include <map>
#include<string>
Using namespace std;
Typedef structtagStudentInfo
{
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 structtagStudentInfo
{
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 structtagStudentInfo
{
Int nID;
String strName;
}StudentInfo,*PStudentInfo; //学生信息
class 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));
}