C++标准模板库(STL)——map常见用法详解
- map的定义
map<typename1, typename2> mp;
map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型。
注:如果是字符串到整型的映射,必须使用string而不能使用char数组。
map<string, int> mp;
- map容器内元素的访问
map可以通过下标访问或通过迭代器访问。
(1)通过下标访问
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 cout<<mp['c']; 10 return 0; 11 }
输出结果: 2
(2)通过迭代器访问
map迭代器的定义:
map<typename1, typename2>::iterator it;
map可以使用it->first来访问键,使用it->second来访问值。
实例:
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 for(map<char, int>::iterator it=mp.begin();it!=mp.end();it++){ 11 cout<<it->first<<" "<<it->second<<endl; 12 } 13 return 0; 14 }
输出结果: a 1 b 3 c 2
从上面例子我们可以看出,map会以键从小到大的顺序自动排序。这是由于map内部是使用红黑树实现的(set也是)。
- map常用函数
(1)find()
find(key)返回键值为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 map<char, int>::iterator it=mp.find('c'); 11 cout<<it->first<<" "<<it->second; 12 return 0; 13 }
输出结果: c 2
(2)erase()
erase()可以删除单个元素,也可以删除一个区间的所有元素。
①删除单个元素
mp.erase(it),it为需要删除的元素的迭代器,时间复杂度为O(1)。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 map<char, int>::iterator it=mp.find('c'); 11 mp.erase(it); 12 for(map<char, int>::iterator it=mp.begin();it!=mp.end();it++){ 13 cout<<it->first<<" "<<it->second<<endl; 14 } 15 return 0; 16 }
输出结果: a 1 b 3
mp.erase(key),key为欲删除的映射的键。时间复杂度为O(logN),N为map内元素的个数。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 mp.erase('c'); 11 for(map<char, int>::iterator it=mp.begin();it!=mp.end();it++){ 12 cout<<it->first<<" "<<it->second<<endl; 13 } 14 return 0; 15 }
输出结果: a 1 b 3
②删除一个区间内的所有元素
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 map<char, int>::iterator it=mp.find('c'); //令it指向键为c的值 11 mp.erase(it, mp.end()); //删除it之后的所有映射 12 for(map<char, int>::iterator it=mp.begin();it!=mp.end();it++){ 13 cout<<it->first<<" "<<it->second<<endl; 14 } 15 return 0; 16 }
输出结果: a 1 b 3
(3)size()
size()用来获得map中映射的对数,时间复杂度为O(1)。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 cout<<mp.size(); 11 return 0; 12 }
输出结果: 3
(4)clear()
clear()用来清除map中的所有元素,时间复杂度为O(N)。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 map<char, int> mp; 5 int main() 6 { 7 mp['a']=1; 8 mp['c']=2; 9 mp['b']=3; 10 mp.clear(); //清空map 11 cout<<mp.size(); 12 return 0; 13 }
输出结果: 0