C++STL之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 ;
输出:1002) 通过迭代器访问,与其他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 7772erase(),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
其实是什么也没有删除。
(3size(),用来获得map中映射的对数,时间复杂度O(1)。

map<string,int> mp ;
    mp["hello"] = 8 ;
    mp["hello"] = 100 ;
    mp["aloha"] = 666 ;
    mp["good"] = 777 ;
    cout << mp.size() << endl ;
输出结果:34clear(),用来清空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快很多。


作者:就是要AC
链接:https://www.acwing.com/file_system/file/content/whole/index/content/2211522/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值