stl map 硬粪脱水

来源:互联网 发布:剑灵人族捏脸数据 编辑:程序博客网 时间:2024/06/10 20:07

基本性质:

关联式容器。
1.用iterator可修改value但无法修改key
2.key值提供快速查找log(N),且map默认从小到大排序过了
3.map(不存在相同key)注意multimap的存在,可存多个相同的key
4.推荐迭代器的宏定义:

Typedef map<int,int>::iterator ITER;

与其他容器优势:

1.map专门就是用来匹配的,
提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力

  1. 但是如果涉及到查找的话,map会更有优势,map自动关于第一关键字排序,查找效率会高点。
    不过如果没有查找的需求的话,可能还是vector好点,毕竟map消耗的排序代价就没必要了。

插入

就搞定2种写法

Map<string,int>m;M["abc"]=123;  //这种写法开销比较大,这个是先开辟abc的空间再赋值的M.insert(make_pair("abc",123));

排序

这里是对key

1.less/greater 按key首字母或数字排列

map<string, int, less<string> > name_score_map;

2.重载cmplen方法,我实现的必须保证每个string长度都不一样
,不然相同长度只能输出一个。

#include<cstdio>#include<iostream>#include<map>using namespace std;struct cmplen{    bool operator()(const string &s1,const string &s2)    {        return s1.length()<s2.length();    }};typedef pair<string,int> PAIR;ostream &operator<<(ostream &out,const PAIR &p){    return out<<p.first<<"\t"<<p.second;}typedef pair<string, int> PAIR;int main(){    map<string,int,cmplen>m;    m["a"]=10;    m["bd"]=20;    m.insert(make_pair("cdsf",30));    m.insert(make_pair("ddf",40));    for(map<string,int>::iterator iter=m.begin();            iter!=m.end();            ++iter)    {        cout<<*iter<<endl;    }    return 0;}

这里是对value

#include<iostream>#include<map>#include<vector>#include<string>#include<algorithm>#define for0(i,j,k) for(int (i)=(j);(i)<(j);(i)++)#define for1(i,j,k) for(int (i)=(j);(i)<=(j);(i)++)using namespace std;typedef pair<string,int>PAIR;ostream &operator<<(ostream &out,const PAIR &p){    return out<<p.first<<"\t"<<p.second;}//法一struct cmp{    bool operator()(const PAIR &p1,const PAIR &p2)    {        return p1.second<p2.second;    }};//法二bool cmp2(const PAIR &p1,const PAIR &p2){    return p1.second<p2.second;}int main(){    map<string,int>MAP;    MAP["a"]=0;    MAP["b"]=56;    MAP.insert(make_pair("c",2));    vector<PAIR>v(MAP.begin(),MAP.end());    sort(v.begin(),v.end(),cmp());//    sort(v.begin(),v.end(),cmp2);// 注意这两种方法 cmp() cmp2 struct的那个要带括号    for(int i=0; i!=v.size(); i++)cout<<v[i]<<endl;    //这里不能用for0了 !=和 < 此处意义不一样    return 0;}

查找

三个方法

1.最简单的:

int x=MAP["abc"];//x是value "abc"是key若不存在key,则是初始化值

2.Find

Map<int,string>::iterator iter=m.find(key);If(iter==m.end(){}else{}

iter返回的数据类型是pair对象iter->first iter->second

3.Count

注意不是查找个数,这个也是存在性的查找
返回的是1or0

删除

Tip:

For(ITER iter=MAP.begin();iter!=MAP.end();){MAP.erase(iter++);}

注意不要写成

For(ITER iter=MAP.begin();iter!=MAP.end();iter++){MAP.erase(iter);}

这个会直接把迭代器删除

删除三种方法
1.

MAP.erase("bfff"); //直接删除key所对应的元素

2.

For(ITER it=MAP.find("bfff"));If(it!=MAP.end())MAP.erase(it);//可增加删除条件

3.

MAP.erase(iter1,iter2);//删除两个迭代器范围内元素

4.

MAP.clear();//全部清空
原创粉丝点击