C++常用标准模板库——map

map
map翻译成映射,map可以将任何基本类型(包括STL容器)映射到任何基本类。(包括STL容器)。如要使用map,需要添加map头文件,并在头文件底下加上“using namespace std”,这样就可以在代码中使用map了。


map的定义,map[HTML_REMOVED] mp;map和其他STL容器的定义上有点不同,因为map需要确定映射前类型(键key)和映射后类型(值value),map存储的数据类型是一对K-V结构的数据。如果map是字符串到整型的映射,必须使用string而不能使用char数组。
map的访问,map一般有两种访问方式,通过“下标”访问或者通过迭代器访问。


(1) 通过“下标”访问,和普通数组的访问方式一样。比如,定义了一个map[HTML_REMOVED] mp;的map,可以使用mp[“hello”] = 8的方式向map中添加数据,用mp[“hello”]访问map中键为“hello”的值。map中的键是唯一的,可以观察下面代码的输出。
unordered_map<string,int> um ;
    um["hello"] = 8 ;
    um["hello"] = 100 ;
    cout << um["hello"] << endl ;
输出:100
(2) 通过迭代器访问,与其他STL迭代器有点不同,由于map的数据类型是K-V结构,因此迭代器包含了这两方面的数据。map迭代器的定义方式为map[HTML_REMOVED]::iterator it;可以通过it->first来访问键,it->second来访问值。观察下面的代码,

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++){
        cout << it->first << ' ' << it->second << endl ;
    }
输出结果:aloha 666
good 777
hello 100
    观察输出结果,很有意思的是map按照键值从小到大排序了,如果是字符串,则按照字典序排序。map是采用红黑树来实现的。


    map的常用函数:
(1) find(key),返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数。

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    auto it = mp.find("good") ;
    cout << it->first << ' ' << it->second << endl ;
输出结果:good 777
(2) erase(),erase()有两种用法:删除单个元素和删除一个区间内的元素。
a. 删除单个元素,删除单个元素也有两种方法
mp.erase(it),it为需要删除的元素的迭代器,时间复杂度O(1)。

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    mp.erase(mp.find("good"));
    for(auto ele : mp){
        cout << ele.first << ' ' << ele.second << endl ;
    }
输出结果:aloha 666
hello 100
mp.erase(key),key为欲删除的映射的键。时间复杂度O(logN)。N为map中元素的个数。

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    mp.erase("good");
    for(auto ele : mp){
        cout << ele.first << ' ' << ele.second << endl ;
    }

输出结果:aloha 666
hello 100
            b. 删除一个区间的元素,这里只能用迭代器删除,erase(st,ed),表示删除[st,ed)区间内的元素。
map<string,int> mp ;
mp["hello"] = 8 ;
mp["hello"] = 100 ;
mp["aloha"] = 666 ;
mp["good"] = 777 ;
mp.erase(mp.find("good"),mp.find("hello"));
for(auto ele : mp){
cout << ele.first << ' ' << ele.second << endl ;
}
输出结果:aloha 666
hello 100
        注意,st的迭代器位置必须在ed之前。
map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    mp.erase(mp.find("good"),mp.find("good"));
    for(auto ele : mp){
        cout << ele.first << ' ' << ele.second << endl ;
    }

        输出结果:aloha 666
good 777
hello 100
其实是什么也没有删除。

(3) size(),用来获得map中映射的对数,时间复杂度O(1)。

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    cout << mp.size() << endl ;
输出结果:3

(4) clear(),用来清空map中所有元素,复杂度为O(N),其中N为map中元素的个数。

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    mp.clear() ;
    cout << mp.size() << endl ; 
输出结果:0
   

map的常见用途:
(1) 需要建立字符(或字符串)与整数之间映射的题目,使用map可以减少代码量。
(2) 判断大整数或者其他类型数据是否存在的题目,可以把map当成bool数组用。
(3) 字符串和字符串之间的映射。
补充:map和键和值都是唯一的,而如果一个键需要对应多个值,就只能使用multimap。另外,C++11标准中还增加了unordered_map,以散列代替map内部的红黑树实现,使其可以用来处理映射而不需要按key排序的需求,速度比map快很多。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

永夜天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值