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用法
第一种:用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博客