C++ STL容器之map操作

来源:互联网 发布:node.js能做什么 编辑:程序博客网 时间:2024/06/06 04:35

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;

这样就可以运行了












原创粉丝点击