详解 C++中STL的map/multimap

这篇具有很好参考价值的文章主要介绍了详解 C++中STL的map/multimap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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>(880));
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关联容器是使得个数据与另一个数据发生映射的容器。

通过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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

    vector/list/deque… 这些容器统称为 序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为 关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是key, value结构的键值对 在数据检索时比序列式容器效率更高 “键

    2024年02月03日
    浏览(33)
  • 20 标准模板库STL之map和multimap

    基础知识         1、map是一个键值映射的容器,键不能重复,值可以重复,内部使用红黑变体的平衡二叉树来实现。向map中插入新的元素时,会自动调节二叉树的排列,将元素放到合适的位置。multimap与map不同的地方在于,map内相同数值的键只能出现一次,multimap内相同数

    2024年02月04日
    浏览(26)
  • 【C++】map/multimap容器

    2024年02月10日
    浏览(28)
  • 【C++ STL之map,set,pair详解】

    在C++的STL(Standard Template Library)中,map是一个非常有用的关联容器。它提供了一种键-值对的数据结构,其中的元素按照键的顺序进行排序,并且每个键是唯一的。本文将详细介绍C++ STL中map的使用方法和一些常见操作。 (1)头文件 (2)初始化方法 可以使用以下方式声明和

    2024年02月12日
    浏览(23)
  • 详解map、set、multimap、multiset的使用

    ✍ 作者 : 阿润菜菜 📖 专栏 : C++ map、set、multimap、multiset是C++ STL中的四种关联容器,它们内部都使用了红黑树这种高效的平衡检索二叉树来存储数据 。它们的区别和用法如下: map是一种 键值对 容器,它可以根据键来快速查找、插入和删除值,它的键是唯一的,不能重复

    2024年02月03日
    浏览(21)
  • 【C++】map、set、multimap、multiset的介绍和使用

    我讨厌世俗,也耐得住孤独。 1. 之前所学的vector,list,deque等容器都是序列式容器,因为他们的底层数据结构都是线性的,并且数据结构中存储的都是元素数据本身,也就是单一的变量。 而下面所学的set、map、multimap、multiset等容器都是关联式容器,他们内部存储的不再是单

    2023年04月15日
    浏览(30)
  • 【045】C++中map和multimap容器全面解析:深入学习,轻松掌握

    在C++中,map和multimap容器是非常重要的数据结构,它们提供了一种键值对的映射关系,可以高效地组织和访问数据。map容器中的每个元素都包含一个键和一个值,而multimap容器允许键重复。 这两种容器在实际项目中广泛应用,特别适合需要快速查找和插入元素的场景。其底层

    2024年01月17日
    浏览(32)
  • C++进阶:详细讲解容器set与map(pair、multiset、multimap)

    C++进阶:详细讲解容器set与map(pair、multiset、multimap) 上次介绍了搜索二叉树:C++进阶:二叉搜索树介绍、模拟实现(递归迭代两版本)及其应用 为了介绍后面的AVLTree和红黑树,我们要进行一些铺垫,就是set与map的介绍啦 关联式容器和序列式容器是 C++ 中两种不同的容器类

    2024年04月12日
    浏览(26)
  • Google 开源库Guava详解(集合工具类)—Maps、Multisets、Multimaps

    Maps有许多很酷的实用程序,值得单独解释。 Maps.uniqueIndex(Iterable,Function)解决了一个常见的情况,即有一堆对象,每个对象都有一些唯一的属性,并希望能够根据该属性查找这些对象。 假设我们有一堆字符串,我们知道它们有唯一的长度,我们希望能够查找具有特定长度

    2024年02月03日
    浏览(30)
  • 【C++】map/multimap/set/multiset的经典oj例题 [ 盘点&全面解析 ] (28)

    前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年02月04日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包