1、头文件 #include <map>
2、有关定义
定义实例: map<int,int> name;定义 map<int,vector<int> > name;时,放入键值对的操作应该是,name[i].push_back(),因为name[i]指向的对象是vector类型的
定义迭代器:map<int,int> : : iterator it
3、元素计数:name.count(关键字),返回值为0或1。表明name中是否存在该关键字的键值对。
4、访问元素:
1.访问键的名称来获得值:value = name[关键字] ; 若不存在该关键字的键值对,不会报错,会插入一个值为空的键值对;
2.使用at来访问 value = name.at(关键字);若不存在该关键字的键值对,则会报错;
3.使用函数find(关键字):此时返回的是迭代器,用起来略复杂,看栗子:
std::map<char,int> mymap;
std::map<char,int>::iterator it;
mymap['a']=50;
mymap['b']=100;
mymap['c']=150;
mymap['d']=200;
it = mymap.find('b'); //迭代器
if (it != mymap.end())//若该键的不存在,it返回.end()
mymap.erase (it); // b被成功删除,顺便讲了怎样删除
5、应用:
前缀和+map,解决一类区间问题,用map的find 方法比循环查找快,时间复杂度为log(N)
map<long long,vector<int> > k;
map<long long,vector<int> > ::iterator it;
int count=0;
long long num[100001];
vector<int> tt;
sum=0;
num[0]=0;
k[0].push_back(0);
for(i=0; i<n; i++) {
scanf("%d",&a);
sum+=a;//每次读入,记录当前点的位置以及他之前的从开头开始的区间之和,用map标记
num[i+1]=sum;
k[sum].push_back(i+1);
}
6、清空操作
mymap.erase(mymap.begin(),mymap.end());