c++ STL 之 map

柒葉灬

2018-08-22 20:02:09

Personal

# map的使用方法(蒟蒻的总结 - #### 1、map所需要的空间需要注意一下,是普通数组空间的好几倍,访问时间复杂度是log级别的。 - #### 2、map很强大,可以在里面放几乎所有东西,什么string,结构体(要重载小于号)都可以存map里面,比如说pos["abc"]=233。 - #### 3、虽然说map的访问是log级别的,但是如果存太长的string,访问速度也超级慢,(当初写“文件查询”直接存所有父亲目录,T的不要不要的,而且还不知道为什么T)。 ------- ##### 要使用map必须加上头文件 #include<map> 和 using namespace std ```cpp #include<bits/stdc++.h> //真香. using namespace std; map<string,int>pos; int main(){ string a="abc",b="efg"; pos[a]=1,pos[b]=2; cout<<pos[a]<<" "<<pos[b]<<endl; return 0; } ``` ----- ### 以下是map常用的自带函数。 - **1,map的清空:** pos.clear(); - ** 2,map的添加:**pos["abc"]=++id; **但一般我们会这么写 :** ```cpp int read(string a){ if(pos.find(a)==pos.end()) pos[a]=++id; return pos[a]; } ``` ----- #### map是个很好用的东西,比如说有些恶心的题目,明明是个最短路的题目,读入的时候非要给你读入地方的名字,这时候就可以用map轻轻松松解决。 #### map还可以用来hash标记,比如说一块图形的形状,用一个string每次加上dfs的方向,然后pos[a]=1进行标记,问题就可以解决了(不要忘记多加几个字符防止hash冲突)。 ----- 接下来就是更高级的用法了,map里面存结构体。 ```cpp struct node{ string a; int fa; bool operator <(const node &b)const{ if(a!=b.a)return a<b.a; return fa<b.fa; } }; map<node,int>pos; ``` 值得注意的是,map存结构体重载小于号,一定要完全重载,比如说上面的代码中如果直接写 **return fa<b.fa** 就会出错。 ----- 如果map中存了string,map内部会按照字典序排序,那么怎么按照顺序访问呢?按照惯例,map也又迭代器,下面是演示方法。 ```cpp #include<bits/stdc++.h> using namespace std; map<string,int>pos; map<string,int>::iterator it; string a; int main(){ a="zryabc"; pos[a]=1; a="rkj"; pos[a]=2; a="czjxyz"; pos[a]=3; a="wangZY"; pos[a]=4; for(it=pos.begin();it!=pos.end();it++){ cout<< it->first ; putchar(' '); cout<< it->second ; putchar('\n'); } return 0; } ``` ----- _ 写的比较乱=w= ,应该还能勉强看看QuQ