C++——std::Map

本文详细介绍了C++中的std::Map容器,包括其特性、构造方法、操作符、迭代器、容量、元素访问、修改和观察方法。通过实例解析了map的常用功能,如插入、删除、查找等,强调了map在实际问题中的应用。
摘要由CSDN通过智能技术生成

写在前面:

有一段时间没有继续进行C++容器的学习了。这次接着C+±std::Vector 的内容继续学习。通过之前的vector的学习,我发现虽然对该容器有一个比较全面的认识,但是很多细节还是不能注意好。比如在 LeetCode-406. Queue Reconstruction by Height 这道题中使用vector的insert函数,而我之前的方法由于没有把握好erase函数的使用特点,这道题没有顺利解决。所以在map学习中,将更加注重容器的特性与函数的运用方法与结果特点。

map类与头文件包含:

STL map微软官方文档翻译为“映射”,map是一种关联容器,按照特定顺序存储由键值和映射值组合形成的元素。map提供一个键值对容器,它提供了很好一对一的关系,它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

map可以自动建立Key - value(键值对)的对应。key 和 value可以是任意你需要的类型。 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。可以 快速插入Key - Value 记录、 快速删除记录。根据Key 修改value记录。 遍历所有记录。 使用map需要引入头文件:

#include <map> //注意,STL头文件没有扩展名.h

这一点在我之前的vector总结中有误,已经更正。map语法表达如下:

template <
	class Key,   
    class Type,   
    class Compare = less<Key>,   
    class Allocator=allocator<pair <const Key, Type>>>  
class map;  

其中:

  • key:要存储在映射中的键数据类型;
  • Type:要存储在映射中的元素数据类型;
  • Compare:一种提供函数对象的类型,该函数对象可将两个元素值作为排序键进行比较,以确定其在映射中的相对顺序。 此参数为可选和二元谓词less< Key >是默认值。默认key由小到大排序。

map::map

1.构造一个空的map:

	map <int, int> m0; //键值对类型为int,int

2.构造一个空map,指定排序键类型less than,并插入4个元素:

	typedef pair <int, int> Int_Pair; 
	map <int, int, less<int> > m1;  //注意这里的两个>符号,最好有一个空格,不然会误认为>>
	m1.insert(Int_Pair(1, 10));  
	m1.insert(Int_Pair(2, 20));  
	m1.insert(Int_Pair(3, 30));  
	m1.insert(Int_Pair(4, 40));  

3.构造一个空map,指定排序键类型greater than,并插入2个元素:

	 map <int, int, greater<int> > m2;  
	 m2.insert(Int_Pair(1, 10));  
	 m2.insert(Int_Pair(2, 20));  

这个地方微软文档记录有误,我顺手改了过来。关于greater< int >与less< less >可以参考这篇文档:greater()和less()的使用

4.利用m1的分配器构造m3:

    map <int, int>::allocator_type m1_Alloc;  
    m1_Alloc = m1.get_allocator();  
    map <int, int> m3(less<int>(), m1_Alloc);  
    m3.insert(Int_Pair(3, 30)); 

5.通过拷贝m1创建m4:

    map <int, int> m4(m1);  

6.通过拷贝m1的first到last区域的内容创建m5:

	map <int, int>::const_iterator m1_bcIter, m1_ecIter;  
    m1_bcIter = m1.begin();  
    m1_ecIter = m1.begin();  
    m1_ecIter++;  m1_ecIter++;  
    map <int, int> m5(m1_bcIter, m1_ecIter);  

7.拷贝初值链表的方式创建map:

	map<int, int> m8{ { { 1, 1 }, { 2, 2 }, { 3, 3 },
引用\[1\]中的代码展示了如何使用迭代器遍历打印一个map容器中的键值对。引用\[2\]和引用\[3\]中的代码展示了如何创建一个map容器,并使用自定义的比较规则对键进行排序。 在C++中,std::map默认是按照键的升序进行排序的。这是因为std::map内部使用了红黑树这种数据结构来实现,红黑树保证了元素的有序性。 如果你想要改变std::map的排序方式,可以通过自定义比较规则来实现。在引用\[2\]中的代码中,使用了一个自定义的比较规则struct cmp来对键进行排序,根据键的长度进行升序排序。而在引用\[3\]中的代码中,没有使用自定义的比较规则,所以默认按照键的升序进行排序。 总结起来,std::map默认是按照键的升序进行排序的,如果你想要改变排序方式,可以通过自定义比较规则来实现。 #### 引用[.reference_title] - *1* [C++笔记 STL map容器基本操作 排序](https://blog.csdn.net/weixin_40933653/article/details/123886457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STL容器(三)——对map排序](https://blog.csdn.net/puqutogether/article/details/41889579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值