STL 中的pair、map和multimap容器方法与API


前言

本章主要记录pair、map和multimap 类中的各种方法,函数,以及它们的用途
本章内容仅为学习记录,如有纰漏,欢迎指正


一、pair对组

pair实际上是一个键值对,它并不属于STL标准模板库,不需要引入头文件

1.一般常用的实例化方法:

pair<type, type> p1 (key, value);
pair<type, type> p2 = make_pair(key, value);

2.获取元素的方法:

第一个元素为first,第二个为second
调用直接用 对象.first或者 对象.second

//以上面的为例,获取第一个元素(key)
cout << p1.first << endl;
//获取第二个元素(value)
cout << p1.second << endl;
//如果是指针则改成->即可

二、map容器

1.简介

  • map中所有元素都是pair
    pair中第一个元素为key,第二个元素为value
  • 所有元素都会根据键值自动排列
  • 是一个关联式容器,底层使用二叉树(红黑树)实现
  • map不允许容器有重复的key元素
  • multimap允许重复的key

2.构造和赋值

map<T1, T2> mp;
map(const map &mp);

map& operator= (const map& mp);

3.大小和交换

size();
empty();
swap(mp);

4.插入

insert(ele);
//插入元素必须是pair(键值对)类型的,可以通过以下方式构建pair
insert(pair<T1, T2>(key, value));	//匿名类方式创建pair,必须指定模板类型
insert(make_pair(key, value));		//使用API创建pair
insert(map<T1, T2>::value_type(key, value));	//指定值类型添加键值对
  • 或者可以通过直接 对象[key] = value; 或者 对象key; 的方式进行添加pair,
    也可以直接通过 对象[key] 的方式进行运算,非常方便
  • 但是需要注意的是,当你调用 对象[key] 时,如果还没有添加这个键值对,
    他就会帮你直接添加一个键值对(key, default_value),传入的key作为key,value则为默认值
    例:
void test()
{
	map<int, int> mp;
	mp.insert(pair<int, int>(1, 10));
	mp.insert(make_pair(2, 20));
	mp[3] = 30;
	mp[4] += 40;		//value默认值为0,创建后添加40=> value == 40
	mp[5]++;
	mp[0] = 100;

	for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++)
	{
		cout << it->first << " " << it->second << endl;
	}
}

输出结果:

0 100
1 10
2 20
3 30
4 40
5 1

5.删除

clear();
erase(pos);
erase(beg, end);
erase(key);

6.查找和统计

find(key);	
count(key);	//使用这个API,对于map而言只有1, 0
			//multimap可以有多个

7.使用仿函数指定排序规则

  • 和set类似,map也有重载版本:map<T1, T2, cmp>;
  • 所以同样可以使用仿函数来改变排序规则,其本质是重载()运算符的一个比较类,
    而类可以作为模板参数类型传入容器。
class Cmp
{
public:
	bool operator()(const int& pre, const int& cur)const
	{
		return pre > cur;
	}
};

int main()
{
	map<int, int, Cmp>mp;
	mp.insert(make_pair(1, 100));
	mp.insert(make_pair(2, 100));
	mp.insert(make_pair(3, 100));
	mp.insert(make_pair(4, 100));
	mp.insert(make_pair(5, 100));

	for (auto it = mp.begin(); it != mp.end(); it++)
	{
		cout << it->first << endl;
	}

	return 0;
}

输出结果:

5
4
3
2
1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KamikazePilot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值