C++中map的用法

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。

这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

下面的代码,包括map容器的一些常用方法,包括插入数据、查询数据、遍历数据、删除数据、map容器长度等。代码如下:

#include <iostream>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{  
	map<int,string> mapStudent;

	//map 插入数据有三种方式
	//map 的第一种插入数据方式  插入pair数据
	mapStudent.insert(pair<int,string>(10,"student_ten"));
	mapStudent.insert(pair<int,string>(1,"student_one"));
	mapStudent.insert(pair<int,string>(1,"student_1"));
	mapStudent.insert(pair<int,string>(2,"student_two"));
	mapStudent.insert(pair<int,string>(3,"student_three"));
	
	//map 第二种插入数据方式 插入value_type数据
	mapStudent.insert(map<int,string>::value_type (4,"student_four"));
	mapStudent.insert(map<int,string>::value_type (4,"student_4"));
	mapStudent.insert(map<int,string>::value_type (5,"student_5"));
	mapStudent.insert(map<int,string>::value_type (6,"student_6"));
	
	//map 第三种插入数据方式 用数组方式插入数据 
	mapStudent[7] = "student_seven";
	mapStudent[7] = "student_7";
	mapStudent[8] = "student_8";
	mapStudent[9] = "student_9";

	//查看map里的数据长度,用size函数
	cout<< "isize = "<< mapStudent.size() <<endl;

	//ps:用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入不了数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值。

	//map 遍历也有三种方式
	
	//遍历第一种方式 应用反相迭代器   
	map<int,string>::reverse_iterator iterr;
	for(iterr = mapStudent.rbegin(); iterr != mapStudent.rend(); iterr++)
	{
		cout<<"遍历第1种"<<iterr->first<<" "<<iterr->second<<endl;
	}

	//遍历第二种方式 应用前向迭代器  常用的遍历方式
	map<int,string>::iterator iter;
	for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
	{
		cout<<"遍历第2种"<<iter->first<<" "<<iter->second<<endl;
	}

	//遍历第二种方式 数组方式  //也就是下标操作,只能特定情况使用。
	for(int nIndex = 1; nIndex <= mapStudent.size(); nIndex++)
	{
		cout<<"遍历第3种"<<mapStudent[nIndex]<<endl;
	}

	//查看map里的数据长度,用size函数
	cout<< "isize1 = "<< mapStudent.size() <<endl;

	//map 查找的方式常用的有两种,find()用的比较多

	//第一种查找方式 count()函数 查找关键字为9的个数  只能查找关键字
	int icount = mapStudent.count(9);
	int icount1 = mapStudent.count(11);
	cout << "cout = "<< icount <<"; cout1 = "<< icount1<< endl;

	//第二种查找方式  find()函数
	iter = mapStudent.find(5);
	if (iter != mapStudent.end())
	{
		cout<<"Find,the value key: " <<iter->first<<", value: "<<iter->second<<endl;
	} 
	else
	{
		cout<<"Do not Find"<<endl;
	}

	//清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map
	if (mapStudent.empty() != 0)
	{
		cout<< "mapStudent  not have data!" <<endl;
	}
	else
	{
		cout<< "mapStudent  have data!" <<endl; 
	}

	//删除元素有两种方式
	//第一种 按关键字删除
	mapStudent.erase(5);

	//查看map里的数据长度,用size函数
	cout<< "isize2 = "<< mapStudent.size() <<endl;

	//用迭代器,成片的删除
	iter = mapStudent.find(1);
	mapStudent.erase(iter);

	//查看map里的数据长度,用size函数
	cout<< "isize3 = "<< mapStudent.size() <<endl;

	//用迭代器,成片的删除
	//一下代码把整个map清空
	mapStudent.erase(mapStudent.begin(),mapStudent.end());

	//查看map里的数据长度,用size函数
	cout<< "isize4 = "<< mapStudent.size() <<endl;


	return 0;
}  

各cout的输出结果如下:

isize = 10

遍历第1种10 student_ten

遍历第1种9 student_9

遍历第1种8 student_8

遍历第1种7 student_7

遍历第1种6 student_6

遍历第1种5 student_5

遍历第1种4 student_four

遍历第1种3 student_three

遍历第1种2 student_two

遍历第1种1 student_one

遍历第2种1 student_one

遍历第2种2 student_two

遍历第2种3 student_three

遍历第2种4 student_four

遍历第2种5 student_5

遍历第2种6 student_6

遍历第2种7 student_7

遍历第2种8 student_8

遍历第2种9 student_9

遍历第2种10 student_ten

遍历第3种student_one

遍历第3种student_two

遍历第3种student_three

遍历第3种student_four

遍历第3种student_5

遍历第3种student_6

遍历第3种student_7

遍历第3种student_8

遍历第3种student_9

遍历第3种student_ten

isize1 = 10

cout = 1; cout1 = 0

Find,the value key: 5, value: student_5

mapStudent  have data!

isize2 = 9

isize3 = 8

isize4 = 0



猜你喜欢

转载自blog.csdn.net/lycx1234/article/details/55097395