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快很多。
作者:就是要AC
链接:https://www.acwing.com/file_system/file/content/whole/index/content/2211522/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
C++STL之map
最新推荐文章于 2023-10-28 11:24:01 发布