C++ STL容器之map操作

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;

这样就可以运行了












猜你喜欢

转载自blog.csdn.net/alex1997222/article/details/78836873