C++的STL标准库学习(map)(第六篇)

Map的特性是,所有元素都会根据元素的键值(从小到大)自动排序。

Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。

功能:

map中所有元素都是pair, pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值),所有元素都会根据元素的键值自动排序。
本质:map/multimap属于关联式容器,底层结构是用二叉树实现。


优点:可以根据key值快速找到value值 。

 

#include<iostream>
#include<map>
using namespace std;
map<string,int>s;//这个是map的格式 
int main()
{
	int n;
	string a,b;//字符串a和b 
	while(cin>>n&&n!=0)
	{
		int maxn=1;//先声明为1,如果后面发现的实值大于1,将实值赋给maxn,
		//表示为这个元素出现的次数 
		s.clear();//情况容器s中的所有元素 
		for(int i=0;i<n;i++)
		{//输入元素给a,元素a相当于键值,容器s中每个键值是唯一的, 
		//而每个键值对应的实质一开始都是0,当s[a]=0,出现一次就+1 
			cin>>a;
			s[a]++;
			if(s[a]>maxn)//如果发现某个键值对应的实值大于maxn,则将该实质赋给maxn,它是最大的 
			{
				b=a;//b存储的是出现最多次数的元素 
				maxn=s[a];
			}
		}
		cout<<b<<endl;//输出出现次数最多的元素 
	}
}

一些主要的函数如下:

map的大小和交换:

size(); 返回容器中元素的数目。
empty(); 判断容器是否为空。
swap(st); 交换两个集合容器。

 map插入和删除

insert(elem); 在容器中插入元素。
clear(); 清除所有元素。
erase(pos); 删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(key); 删除容器中值为key的元素。

map的查找和统计

find(key); 查找key是否存在,若存在返回该元素的迭代器;若不存在,返回set.end();
count(key); 统计key元素的个数但是由于map中元素是以键值对的形式存在,且键(key)是唯一的,所以count(key)最大返回1。

 下面通过以下代码学习map容器插入元素的格式,迭代器输出容器内元素的代码

#include<iostream>
using namespace std;
#include<map>
void printMap(map<int, int>&m)//输出这个容器的自定义函数,传递的参数是m1 
{//在for循环里先声明it是map容器的迭代器,可以理解为指针,一开始它的首地址指向这个容器的首地址m.begin
//只要这个迭代器未遍历到结尾m.end,就进入循环,然后it++,移动到下个元素的位置 
//然后其次在这个循环里面遍历每一个元素 
 for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
 {
  cout << "(键值)key = " << (*it).first << "  (实值)value = " << it->second << endl;
 }//每个元素pair里面包含键值和实值,而键值在第一个位置,实值在it->second pair元素的第二个位置 
 cout << endl;
 
  cout<<"容器m1的元素个数="<<m.size()<<endl;
  cout<<"该容器中元素1(键值)的最大个数="<<m.count(1)<<endl;
  //由于map中元素是以键值对的形式存在,且键(key)是唯一的,所以count(key)最大返回1。
}//以上是迭代器的输出,其他的容器也可以同样使用这个方法 

void test02()
{
 map<int, int>m1;//声明这个是一个map容器,请记住这个格式 
 m1.insert(pair<int, int>(5, 10));//插入的格式,插入一个键值为5,实值为10的元素 
 m1.insert(pair<int, int>(2, 20));//插入一个键值为2,实值为20的元素 
 m1.insert(pair<int, int>(1, 31));//插入一个键值为1,实值为30的元素 
 printMap(m1);//调用函数输出容器m1中所有元素 
}

int main()
{
 test02();
 return 0;
}

七、map中insert用法

1.用insert函数插入pair数据

第一种:用insert函数插入pair数据:在VC下请加入这条语句,屏蔽4786警告 #pragma warning (disable:4786) )

map<int, string> mapStudent;
   
mapStudent.insert(pair<int, string>(1, "student_one"));
   
mapStudent.insert(pair<int, string>(2, "student_two"));
   
mapStudent.insert(pair<int, string>(3, "student_three"));

第二种:用insert函数插入value_type数据,下面举例说明

 

map<int, string> mapStudent;
   
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
   
mapStudent.insert(map<int, string>::value_type (2, "student_two"));
   
mapStudent.insert(map<int, string>::value_type (3, "student_three"));

第三种:在insert函数中使用make_pair()函数,下面举例说明

map<int, string> mapStudent;

mapStudent.insert(make_pair(1, "student_one"));

mapStudent.insert(make_pair(2, "student_two"));

mapStudent.insert(make_pair(3, "student_three"));

第四种:用数组方式插入数据,下面举例说明

 

map<int, string> mapStudent;
   
mapStudent[1] = "student_one";
   
mapStudent[2] = "student_two";
   
mapStudent[3] = "student_three";

​​​​​​​

 第一篇:(9条消息) C++的STL标准库学习(vector)_教授先生的博客-CSDN博客

第二篇:(9条消息) C++的STL标准库学习(deque)双向队列_教授先生的博客-CSDN博客

第三篇:(9条消息) C++的STL标准库学习(stack)栈_教授先生的博客-CSDN博客

第四篇:(9条消息) C++的STL标准库学习(queue)队列(第四篇)_教授先生的博客-CSDN博客

第五篇:(9条消息) C++的STL标准库学习(set)(第五篇)_教授先生的博客-CSDN博客

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值