Map是STL的一个关联容器,它提供一对一的数据处理能力
其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为关键字的值
map可以看作是一棵有序的红黑树,这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的
map<int, string> mapStudent;
这里mapStudent有两个属性,int可表示为学生的学号,string可表示学生的姓名
数据的插入:
方法1:用pair<type1,type2>的方式插入
mapStudent.insert(pair<int, string>(1, "Student1"));
mapStudent.insert(pair<int, string>(2, "Student2"));
mapStudent.insert(pair<int, string>(3, "Student3"));
Map的迭代器声明时,数据类型也必须和map一致
//map迭代器的属性也必须一致
map<int, string>::iterator itr1;
for (itr1 = mapStudent.begin(); itr1 != mapStudent.end(); itr1++)
{
cout << itr1->first << " " << itr1->second << endl;
}
方法2:使用valueType构建键值对构建容器
map<int, string> mapStudent2;
mapStudent2.insert(map<int, string>::value_type(4,"student4"));
mapStudent2.insert(map<int, string>::value_type(5,"student5"));
mapStudent2.insert(map<int, string>::value_type(6,"student6"));
map<int, string>::iterator itr2;
for (itr2 = mapStudent2.begin(); itr2 != mapStudent2.end(); itr2++)
{
cout << itr2->first << " " << itr2->second << endl;
}
方法3:使用数组来进行构建
map<int, string> mapStudent4;
mapStudent4[1] = "student_one";
mapStudent4[2] = "student_two";
mapStudent4[3] = "student_three";
map<int, string>::iterator iter;
for (iter = mapStudent4.begin(); iter != mapStudent4.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
这三种方法中:第一种方法和第二种方法是一样的
但第三种方法可能会覆盖关键字对应的值
//覆盖的情况
cout << endl << endl;
mapStudent[1] = "student_five";
for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) //容器遍历数据
{
cout << iter->first << " " << iter->second << endl;
}
运行结果:
插入前
插入后
MAP的大小size:
cout << endl << endl;
int nSize = mapStudent.size();
cout << nSize << endl;
MAP的查找:
通过find()函数通过关键字查找,如果根据关键字找到了值,则返回数据所在位置的迭代器
如果map中没有要找的数据,则返回map中end位置的数据
//数据的查找
cout << endl << endl;
itr1 = mapStudent.find(5);
if (itr1 != mapStudent.end()) {
cout << itr1->first << " " << itr1->second << endl; //如果找到了数据,就返回当前数据
//没找到,就返回末尾的数据
}
else {
cout << "can not find the number" << endl;;
}
数据的删除:
删除分为单个删除和成片删除
单个删除通过关键字删除单个值
成片删除则根据迭代器范围删除一片数据
bool isDelete = mapStudent.erase(2);
for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) //容器遍历数据
{
cout << iter->first << " " << iter->second << endl;
}
cout << endl << endl << endl;
/*成片删除*/
mapStudent.erase(mapStudent.begin(), mapStudent.end());
全部删除的话:使用clear()函数
//map的清空
mapStudent.clear();
if (mapStudent.empty()) { //empty函数判断map是否为空
cout << "The map has been empty!" << endl;
}
排序:
STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去
解决方式:操作符重载
一个例子如下:
#include <algorithm>
#include <string>
using namespace std;
typedef struct tagStudent
{
int stuNo; //学号
string Name; //名字
}Student,*PStudent;
int main() {
map<Student, int> studentGrades;
Student stdOne;
stdOne.Name = "AAA";
stdOne.stuNo = 1;
Student stdTwo;
stdTwo.Name = "BBB";
stdTwo.stuNo = 2;
//此时程序报错,因为结构体Student大小无法比较
studentGrades.insert(pair<Student, int>(stdOne, 90));
studentGrades.insert(pair<Student, int>(stdTwo, 80));
system("PAUSE");
return 0;
}
如果要比较的话,得重载操作符
typedef struct tagStudent
{
int stuNo; //学号
string Name; //名字
bool operator < (const tagStudent& right) const {
if (this->stuNo < right.stuNo) return true;
if (this->stuNo == right.stuNo) {
return this->Name.compare(right.Name) < 0;
}
return false;
}
}Student,*PStudent;
这样就可以运行了