1. 什么是map/multimap容器?
ap容器中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。
同时,所有元素都会根据元素的键值自动排序。
map/multimap属于关联式容器,底层数据结构是用二叉树实现的。它的优点就是可以根据key值快速找到value值。
这里需要了解map与multimap的区别∶即map不予许容器中有重复的key值元素;而multimap允许容器中有重复的key值元素,这里的区别与set与multiset十分类似。
2. 什么是pair对组?
pair只含有两个元素,可以看作是只有两个元素的结构体。对于成对出现的数据,利用对组可以返回两个数据
应用:
代替二元结构体
作为map键值对进行插入
在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同,可以在定义时进行成员初始化。
使用Pair对组时,需要引用#include
2.1 pair 的格式和初始化:
template<class T1,class T2>struct pair;
pair<int,int>p;
pair<int,int>p(10,20);
//或者是
map<char,int>m;
m.insert(pair<char,int>('a',10));
2.2 pair数据访问
pair<int,int>p0;
p0.first=p0.second=12;
//用于pair赋值的make_pair方法
//使用make_pair可以避免对变量对行分开赋值,也可以对变量进行隐性的类型转换,不需要指定类型。
pair<int,int>p;
p=make_pair(10,20);
pair<string,int>p("小明",17);
cout<<"姓名:"<<p.first<<"年龄:"<<endl;
pair<char,float>p1=make_pair('p',3.14);
cout<<"字符:"<<p1.first<<"数z值:"<<p1.second<<endl;
3. map/multimap的初始化函数
map/multimap<T,T>m //map/multimap默认构造函数
map/multimap(const map &mp) //拷贝构造函数
map/multimap& operator(const map&mp)
//操作符赋值(重载)
显而易见,map和multimap的初始化函数基本一模一样。
4. map/multimap的大小和交换函数
size() //返回容器中元素的数目
empty() //判断容器中是否为空
swap(st) //交换两个容器的值
5. map的插入与删除函数
insert(elem) //插入元素elem
clear() //清空容器
erase(pos) //删除pos迭代器位置的元素
erase(beg,end) //删除区间[beg,end)的所有元素
erase(key) //删除容器值为key的元素
6. 案例:
#include<iostream>
#include<map>
#include<utility> //pair的头头文件
void Print(map<int,int>m)
{
for(auto i=m.begin();i!=m.end();i++)
{
cout<<i->first<<" "<<i->second<<endl;
}
}
using namespace std;
int main()
{
//map
map<int,int>m;
//multimap
//multimap<int,int>m;
//这里即使把map换成multimap,也使用方法也是一模一样的。
m.insert(pair<int,int>(1,10));
m.insert(pair<int,int>(3,30));
m.insert(make_pair(4,40));
Print(m);
if(m.empty(){
cout<<"容器为空"<<endl;
}
else{
cout<<m.size()<<endl;
}
map<int,int>m2;
m2.insert(pair<int,int>(6,60));
m2.insert(pair<int,int>(7,70));
m2.insert(pair<int,int>(8,80));
Print(m);
m2.swap(m);
Print(m2);
m.earse(m.begin());
Print(m);
m.earse(8);
Print(m);
m.clear();//m.erase(m.begin(),m.end());
cout<<m.size()<<endl;
return 0;
}
7. map的查找和统计函数
find(key)
//查找key是否存在,返回该元素的迭代器,若不存在,返回end()迭代器。
count(key) //统计key元素的个数
#include<iostream>
#include<map>
#include<utility>
using namespace std;
int main()
{
//一种新的初始化方式
multimap<int,int>m={{1,2},{3,4},{5,6},{7,8},{2,44}};
auto it=m.find(3);
cout<<it->first<<" "<<it->second<<endl;
cout<<m.count(1)<<endl;
//因为map容器不能重复,所以使用的要注意,map的count方法只可能返回1或0,如果是multimap的话,就允许元素重复。
return 0;
}
8. multimap跟map区别
Multimap时map映射容器的一种,其拥有map的全部内容,并在此基础之上,multimap还具有了可以重复保存元素的功能,与上文的mutliset差不多任何进行访问单个值得语句访问均只会返回第一个位置,这里不再多说,而是举一个实际中可能用得到得例子。
有没有一种方法,使得一个key值能够对应多个value,产生一种诸如一个学生有多门考试成绩一样的映射。我们都知道map关联容器是使得个数据与另一个数据发生映射的容器。文章来源:https://www.toymoban.com/news/detail-603995.html
通过key得到value产生一一对应,那么multimap在此基础上使得map元素可以重复,因此这种情况可以使multimap。文章来源地址https://www.toymoban.com/news/detail-603995.html
#include<iostream>
#include<map>
#include<utility>
void Print(multimap<int,int>m)
{
for(auto i=m.begin();i!=end();i++)
{
cout<<i->first<<" "<<i->second<<endl;
}
}
int main()
{
multimap<int,int>m={{1,2},{1,4},{1,6},{7,8},{2,44}};
cout<<m.count(1)<<endl;
auto p1=m.lower_bound(1); //找到大于或等于1的元素
cout<<p1->first<<" "<<p1->second<<endl;
auto p2=m.upper_bound(1); //找到大于1的元素
cout<<p2->first<<" "<<p2->second<<endl;
auto p3=m.qual_range(1); //找到所有值为1的元素
for(auto i=p3.first;i!=p3.second;i++)
{
cout<<i->first<<" "<<i->second<<endl;
}
return 0;
}
到了这里,关于详解 C++中STL的map/multimap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!