map/multimap容器

map基本概念

  • map中的所有元素都是pair
  • pair中的第一个元素是键值(key)起到索引作用,第二个元素是实际值
  • map中的所有元素都会根据键值自动排序

map和multimap属于关联式容器,底层用二叉树实现


关联式容器可以根据key值快速找到value值,平均的时间复杂度只有O(log n)(无序关联容器为O(1))


map中不允许有重复的键值,multimap中允许有重复的键值

map构造和赋值

cpp 复制代码
//默认构造函数
map<T1, T2> mp;
//拷贝构造函数
map<T1, T2>(const map& mp);
//利用重载=赋值
map& operator=(const map& mp);

map容器的大小和交换

cpp 复制代码
//返回容器中元素的个数
int size();
//判断容器是否为空
bool empty();
//交换两个容器的元素
void swap(map& mp);

插入和删除

cpp 复制代码
//插入元素
pair<auto iterator, bool> insert(pair<T1, T2>(key, value);
//清除容器中的所有元素
void clear();
//删除迭代器指向的位置,返回下一个元素的迭代器
iterator erase(iterator pos);
//删除键值为key的元素,返回删除的元素的个数
int erase(key);
//删除beg和end之间的元素(左闭右开),返回下一个元素的迭代器
iterator erase(iterator beg, iterator end);
  • 在map容器中,同样的键值只能存在一个 insert函数的返回值中的布尔类型就是判断是否插入成功。
  • 如果因为相同的键值已经存在而未能插入成功则pair中的迭代器会返回已经存在的拥有同样键值的函数的迭代器。

map容器查找与访问

cpp 复制代码
//查找键值为key的元素并返回其迭代器,若不存在则返回mp.end()
iterator find(key);
//统计容器中键值为key的元素的个数
int count(key);

map容器的读写

cpp 复制代码
//重载了[]运算符,通过键值读写元素
T2& operator[](const T1& key);

若使用 mp[key] = value赋值时对应键值不存在则编译器会自动创建一个key和value键值对给容器

map容器排序

与set容器相同,map容器也可以通过自定义的仿函数改变默认的排序规则或者给自定义的数据类型排序

cpp 复制代码
//通过这个仿函数可以让map对键值的排序变为从大到小
class myCompare
{
public:
	bool operaotr()(int v1, int v2)
	{
	 	return v1 > v2;
	 }
};
//定义map时在模板参数列表中加入该仿函数即可
map<int, int, myCompare> mp;

也可以通过函数指针来改变排序的规则

cpp 复制代码
bool myCompare(int v1, int v2)
{
	return v1 > v2;
}

void test01()
{
	bool(*func_ptr)(int, int);
	func_ptr = myCompare;
	//以上两个步骤也可以直接改为:
	//bool(*)(int, int) func_ptr = myCompare;
	map<int, int, bool(*)(int, int)> mp(func_ptr);
	//这一步等效为:
	//map<int, int,bool(*)(int, int)> mp(func_ptr);
}

在map的模板参数列表中只能声明参数的类型而不能传递具体的实例,像下面的写法就是错误的示范:

cpp 复制代码
map<int, int, func_ptr> mp();
相关推荐
恋爱绝缘体12 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
Z1Jxxx2 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++2 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
鱼跃鹰飞3 小时前
Leetcode1891:割绳子
数据结构·算法
️停云️3 小时前
【滑动窗口与双指针】不定长滑动窗口
c++·算法·leetcode·剪枝·哈希
charlie1145141913 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
IT=>小脑虎4 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习
在路上看风景4 小时前
01. C++是如何工作的
开发语言·c++
码农小韩4 小时前
基于Linux的C++学习——指针
linux·开发语言·c++·学习·算法
小L~~~4 小时前
绿盟校招C++研发工程师一面复盘
c++·面试