C++标准模板库(STL):map和pair

本文深入解析了C++ STL中的map和pair容器。map是一种关联容器,用于将一种类型映射到另一种类型,自动排序并确保键的唯一性。pair则是一个包含两个元素的小容器,用于组合不同类型的元素。文章详细介绍了它们的使用方法、常见函数及实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、map

map是STL中的一种关联容器,可以将任何基本类型映射到任何基本类型(包括STL容器),映射前的类型称为key(键),映射后的类型称为value(值)。map可以自动建立键值对的对应,并且会以键从小到大的顺序自动排序

1.map基本用法

(1)头文件

#include <map>
using namespace std;

(2)定义
不同于其他stl容器,map在定义时需要确定键typename1和值typename2,已完成typename1到typename2的映射,typename可以是基本数据类型也可以是stl容器。

map<typename1,typename2> m;
map<string,int> m1;
map<set<int>,string> m2;

(3)元素访问
使用下标访问:键作为索引可以得到对应的值
要注意的是map中的键是唯一的,对同一个键赋值会对之前的值进行覆盖。

map<int,char> m;
m[1]='a';
printf("%c\n",m[1]);    //a
m[1]='b';
printf("%c\n",m[1]);    //b

使用迭代器访问:
迭代器可以同时访问每个键值对的键和值,it->first访问键,it->second访问值

for(map<int,char>::iterator it=m.begin();it!=m.end();it++)
	printf("%d %c\n",it->first,it->second);

2.map常用函数

(1)size()
获得map中键值对的个数

(2)find()
find(key)返回键为key的映射的迭代器

map<int,char> m;
m[1]='a';
m[2]='b';
map<int,char>::iterator it=m.find(1);
printf("%d %c\n",it->first,it->second);    //1 a

(3)erase()
删除单个元素:erase(it),it为需要删除的映射的迭代器

map<int,char> m;
m[1]='a';
map<int,char>::iterator it=m.find(1);
m.erase(it);
printf("%d\n",m.size());    //0

或者erase(key),key为需要删除的映射的键

map<int,char> m;
m[1]='a';
m.erase(1);
printf("%d\n",m.size());    //0

删除一个区间内的所有元素:erase(begin,end),begin和end分别为区间的首尾迭代器,左闭右开。

map<int,char> m;
m[1]='a';
m[2]='b';
m[3]='c';
map<int,char>::iterator it=m.find(2);
m.erase(it,m.end());    //删除it之后的所有映射
for(it=m.begin();it!=m.end();it++)
	printf("%d %c\n",it->first,it->second);   //1 a

(4)clear()
清空map中所有映射

二、pair

pair是将两个元素合成在一起的小容器,可以看成是含有两个元素的结构体,两个元素均可以是任意的数据类型。

pair基本用法

(1)头文件

#include <utility>
using namespace std;

map内部实现涉及到pair,在导入map头文件时会自动导入utility头文件,因此要使用pair也可以直接使用和map相同的头文件:

#include <map>
using namespace std;

(2)定义

pair<typename1,typename2> p;
pair<string,int> p1;
patr<int,char> p1(1,'a');    //定义时进行初始化

如果想要临时使用一个pair可以用下面两种方法定义:

p1=pair<int,char>(1,'a');
p2=make_pair(1,'a');

(3)元素访问
p.first访问第一个元素,p.second访问第二个元素
一个简单实例:

#include <stdio.h>
#include <utility>
using namespace std;

int main(){
    pair<int,char> p1(1,'a');
    pair<int,char> p2;
    p2.first=2;
    p2.second='b';
    printf("%d %c\n",p1.first,p1.second);
    printf("%d %c\n",p2.first,p2.second);
    p1=pair<int,char>(3,'c');
    printf("%d %c\n",p1.first,p1.second);
    p1=make_pair(4,'d');
    printf("%d %c\n",p1.first,p1.second);
    return 0;
}

运行结果:

1 a
2 b
3 c
4 d

(4)pair之间的比较
两个pair之间可以直接使用==、!=、<、<=、>、>=进行比较,先对第一个元素进行比较,如果相等再对第二个元素进行比较。

pair<int,int> p1(1,2);
pair<int,int> p2(1,3);
pair<int,int> p3(2,1);  //p1<p2<p3
printf("%d %d\n",p1<p2,p1<p3,p2>p3);    //1 1 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值