ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客:面向阿尼亚学习
算法学习笔记系列持续更新中~
文章目录
一、前言
在 C++ 中,map为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。
map是STL的一个关联容器,它提供一对一的hash。
第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);
二、map的定义
使用map得包含map类所在的头文件
#include < map >
map<数据类型,数据类型> name;
如:
map<int,int> mp;
map<int,string> mp;
map<string,string>mp;
三、map的常用函数
insert(); 插入一个数,插入的数是一个pair
erase();
(1)输入是pair
(2)输入一个迭代器,删除这个迭代器
find(); 查找一个数
lower_bound(x); 返回大于等于x的最小的数的迭代器
upper_bound(x); 返回大于x的最小的数的迭代器
四、map的遍历方法
假设有个map <int,string> s;
第一种:
for(map<string,int>::iterator it=m.begin();; it!=m.end(); it++) {
cout<<it->first<<" "<<it->second<<endl;
}
//C++中如果是个结构体(类)类型的指针,那么访问属性不能使用 . ,而是 -> 。map内部其实就是
//pair,其中first存的是被当成下标的部分,second存的是被当成值的部分。
第二种:
for(auto it:m) {
cout<<it.first<<" "<<it.second<<endl;
}//C++11的新语法
五、map的自定义排序
方法:重载<
#include <iostream>
#include <map>
using namespace std;
struct node
{
int x;
bool operator<(const node y) const
{
return x > y.x;
// return x < y.x;
}
};
int main()
{
map<node, int> mp;
mp.insert({
{
1}, 2});
mp.insert({
{
3}, 1});
mp.insert({
{
2}, 2});
for (auto &i : mp)
{
cout << i.first.x << " "<<i.second<<endl;
}
return 0;
}
}
输出
3 1
2 2
1 2
六、multimap
multimap容器保存的是有序的键/值对
,但是可以保存重复的元素
。multimap中会出现具有相同键值的元素序列。multimap大部分成员函数的使用方式和map相同。因为重复键的原因,multimap有一些函数的使用方式和map有一些区别。
七、unordered_map
unordered_map需要引用
: #include < unordered_map >
unordered_map是一个关联容器,存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。
unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的
注
对于unordered_map容器,其遍历顺序与创建该容器时输入元素的顺序是不一定一致的,遍历是按照哈希表从前往后依次遍历的
不支持lower_bound()和upper_bound()
不支持迭代器
八、unordered_mulimap
unordered_mulimap集结了以上两种结构的特点
注
不支持lower_bound()和upper_bound()
不支持迭代器
最后
莫言真理无穷尽,寸进自有寸进欢