天天看点

【C++】map、unordered_map的基本操作与用法一、头文件二、原理三、用法

一、头文件

#include "map"
           
#include "unordered_map"
           

二、原理

map内部是用红黑树(不严格平衡的二叉排序树)实现的,能够根据插入键值的不同进行自动排序,中序遍历该树即可得到从小到大递增的键值。

unordered_map内部是用哈希表实现,通过特殊的函数把Key值映射到哈希表中的一个位置来访问记录,查找时间复杂度可达到O(1)。

因此,map适用于有序的问题,unordered_map适用于查找的问题。

三、用法

map与unordered_map相同,只需将下面的map换成unordered_map即可。

1、初始化

map<int, char> myMap;
           
map<int, char> myMap = {
                { 1, 'a' },
                { 2, 'b' },
                { 3, 'c' } };
           

2、插入

//直接通过数组方式插入
myMap[10]='y';
           
// 插入单个键值对
myMap.insert(pair<int, char>(6, 'h'));
           
//在指定位置插入,效率更高,不需要排列
myMap.insert(myMap.begin()+3, pair<int, char>(101, 't'));
           
// 多个键值插入
myMap.insert({ {100, 'i'}, {200, 'q'} });
           
//范围多键值插入
map<int,char> secondMap;
secondMap.insert(myMap.begin(), myMap.end());
           

3、取值

//数组方式取值,若不存在该键值,得到空
myMap[100];
           
//at会下标检查,若不存在该键值会被报错
myMap.at(20);
           

4、判空

//空返回true 非空返回false
myMap.empty();
           

5、容量

int length = myMap.size();
           

6、删除

//erase(const key_type& key) 通过参数Key来进行删除
myMap.erase(1);
           
//删除迭代器位置的键值对,并返回指向下一元素的迭代器
myMap.erase(myMap.begin());
           
// 删除一定范围内的元素,并返回一个指向下一元素的迭代器
// 注意:map的迭代器不允许使用+n运算,但可以++
mymap.erase(mymap.begin(), ++mymap.begin());
           

 7、清空

myMap.clear();
           

8、交换

//交换两个map的内容
map<int,char> secondMap = {5,'t'};
secondMap.swap(myMap);
           

9、顺序比较

//比较两个关键字在map中位置的先后,第一个key在前就返回1,否则0
mymap.insert(std::pair<int, char>(2, 'a'));
mymap.insert(std::pair<int, char>(1, 'b'));
//该用例返回1,因为map是有序的红黑树,即使是先插入2,再插入1
std::map<int, char>::key_compare mycomp = mymap.key_comp();
int res = mycomp(1, 2);
cout << res;
           

10、查找

//关键字查询,找到返回指向该关键字的迭代器,否则返回指向end的迭代器
map<int,char>::iterator it = myMap.find(1);
if(it != myMap.end())//存在该键值
    cout << it->second;
           

11、迭代器

//迭代器有八种 begin、end、rbegin、rend和对应的const型 cbegin、cend、crbegin、crend
myMap.begin();//map的第一个键值对
myMap.rbegin();//map的最后一个键值对
           

12、遍历

//通过迭代器的first得到key值,second得到value值
//正序遍历
for(map<char,int>::iterator it = myMap.begin();it!=myMap.end();it++)
    cout << "key:" << it->first << "  value:" << it->second << endl;
//逆序遍历
for (map<int, char>::reverse_iterator it = mymap.rbegin(); it != mymap.rend(); it++)
    cout << "key:" << it->first << "  value:" << it->second << endl;
           

参考:https://blog.csdn.net/shuzfan/article/details/53115922#%E4%B8%80-%E5%A3%B0%E6%98%8E

继续阅读