1 介绍
Map是键-值对的集合,Map中所有的元素都是pair,可是使用键作为下标来获取一个元素。Map内部自建一颗红黑树,map中所有元素都会根据元素的键值自动被排序,同时拥有实值value和键值key,pair的第一个元素被视为键值key,第二个值被视为实值value,同时map不允许两个元素有相同的键值。
map是一个关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作的节点,对其他节点没有什么影响。
根据key值快速查找,查找的复杂度基本是log(N)
2 声明及初始化
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
map<key, value> m;//创建一个名为m的空map对象,其键和值的类型分别为key和value。
map<key, value> m(m2);//创建m2的副本m,m与m2必须有相同的键类型和值类型。
map<key, value> m(b,e);//创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair
map<key, value, comp> mp;//comp可选,为键值对存放策略,即键的比较函数,默认标准库使用键类型定义的 < 操作符来实现键的比较。所用的比较函数必须在键类型上定义严格的弱排序,可将其理解为键类型数据上的“小于”关系。在实际应用中,键类型必须能定义 < 操作符。对于键类型,其唯一的约束就是必须支持 < 操作符。
数据的基本操作
数据的插入
1、用insert函数插入pair数据,如下所示:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mapStudent;
mapStudent.insert(pair<int,string>(1,"wangming"));
mapStudent.insert(pair<int,string>(2,"lifeng"));
mapStudent.insert(pair<int,string>(3,"lihua"));
map<int,string>::iterator iter;
for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)
cout<<iter->first<<' '<<iter->second<<endl;
return 0;
}
==================运行结果==================
1 wangming
2 lifeng
3 lihua
2、用insert函数插入value_type数据
每个STL中的类都有value_type这种东西,通俗的说value_type 就是stl容器盛装的数据的数据类型,例如:
vector<int> vec;
vector<int>::value_type x;
map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
3、用数组方式插入
map<int, string> mapStudent;
mapStudent[1] = "student_one";
mapStudent[2] = "student_two";
mapStudent[3] = "student_three";
注意:三种数据插入方法的区别:
用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值。
3、map大小及迭代器:
描述 | 函数 | 备注 |
---|---|---|
map的大小 | mapStuddent.size(); | |
前向迭代器 | for(iter = myString.begin();iter != myString.end();iter++) | map<int,string>::iterator iter; |
反向迭代器 | for(iter2 = myString.rbegin();iter2 != yString.rend();iter2++) | map<int,string>::reverse_iterator iter2; |
数组迭代 | for(int i = 1;i <= Length;i++) | int Length = myString.size(); |
4、查找并获取map中的元素
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员;
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1, "student_one"));
mapStudent.insert(pair<int, string>(2, "student_two"));
mapStudent.insert(pair<int, string>(3, "student_three"));
map<int, string>::iterator iter;
iter = mapStudent.find(1);
if(iter != mapStudent.end())
cout<<"Find, the value is "<<iter->second<<endl;
else
cout<<"Do not Find"<<endl;
return 0;
}
5、从map中删除元素
移除某个map中某个条目用erase()
iterator erase(iterator it);//通过一个条目对象删除
iterator erase(iterator first,iterator last);//删除一个范围
size_type erase(const Key&key);//通过关键字删除
clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());