C++中map和set如何使用(C++,map,set,开发技术)

时间:2024-05-05 06:12:40 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    一、set

    1.1 set的介绍

    C++中map和set如何使用

    首先要知道set的底层是由红黑树(平衡二叉搜索树)实现的。

    T set存放元素类型,底层是<value, value>的键值对。
    Compare 仿函数,因为实现搜索树需要比较。

    1.2 set的使用

    1.2.1 set的构造
    voidtest_set(){ //默认构造 set<int>s1; //迭代器区间构造 inta[]={1,2,3,4}; set<int>s2(a,a+4); //拷贝构造(深拷贝) set<int>s3(s2); for(inte:s2)cout<<e<<""; cout<<endl; for(inte:s3)cout<<e<<""; cout<<endl;}

    C++中map和set如何使用

    1.2.2 set的迭代器

    C++中map和set如何使用

    可以看到set有反向迭代器。

    voidtest1(){ set<int>s;//排序+去重 s.insert(1); s.insert(2); s.insert(3); s.insert(1); s.insert(3); s.insert(4); //正向迭代器 set<int>::iteratorit1=s.begin(); while(it1!=s.end()) { cout<<*it1++<<""; } cout<<endl; //反向迭代器 set<int>::reverse_iteratorit2=s.rbegin(); while(it2!=s.rend()) { cout<<*it2++<<""; } cout<<endl;}

    C++中map和set如何使用

    因为set的仿函数默认参数是less<T>,所以排的是升序,如果我们想排降序就可以传递greater<T>

    voidtest1(){ set<int,greater<int>>s;//排序+去重 s.insert(1); s.insert(2); s.insert(3); s.insert(1); s.insert(3); s.insert(4); //正向迭代器 set<int>::iteratorit1=s.begin(); while(it1!=s.end()) { cout<<*it1++<<""; } cout<<endl; //反向迭代器 set<int>::reverse_iteratorit2=s.rbegin(); while(it2!=s.rend()) { cout<<*it2++<<""; } cout<<endl;}

    C++中map和set如何使用

    1.2.3 set的修改

    1.2.3.1 insert && find && erase

    C++中map和set如何使用

    C++中map和set如何使用

    C++中map和set如何使用

    voidtest2(){ set<int>s; s.insert(1); s.insert(2); s.insert(3); s.insert(4); s.insert(5); set<int>::iteratorit=s.find(3); s.erase(it); for(auto&e:s) { cout<<e<<""; } cout<<endl;}

    C++中map和set如何使用

    1.2.3.2 count

    C++中map和set如何使用

    传进去一个元素数值,返回该元素的个数

    voidtest2(){ set<int>s; s.insert(1); s.insert(2); s.insert(3); s.insert(4); s.insert(5); cout<<s.count(2)<<endl; cout<<s.count(6)<<endl;}

    C++中map和set如何使用

    因为set的元素是唯一的,所以在set这里count可以用find来代替,但是在后面的multiset可以插入重复的元素,count就可以统计该元素的个数。

    1.3 multiset

    multiset和set的区别是它可以插入重复的元素。其他的接口跟set一致。头文件也跟set相同

    voidtest3(){ multiset<int>ms; ms.insert(1); ms.insert(1); ms.insert(2); ms.insert(3); ms.insert(4); for(auto&e:ms) { cout<<e<<""; } cout<<endl; cout<<"count(1):"<<ms.count(1)<<endl;}

    C++中map和set如何使用

    另外使用find查找时,如果有多个值相同,find返回的值是中序的第一个。

    C++中map和set如何使用

    二、map

    2.1 map的介绍

    C++中map和set如何使用

    key 键值对中key的类型
    T 键值对中value的类型

    注意:

    1️⃣ map中的元素总是按照键值key进行比较排序的。
    2️⃣ map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。

    2.2 map的使用

    构造和迭代器跟上面的set类似,就不过多阐述。

    2.2.1 map的修改

    2.2.1.1 insert

    C++中map和set如何使用

    voidtest4(){ map<string,int>m; m.insert(pair<string,int>("a",1));//匿名对象 m.insert(make_pair("b",2));//简化写法 m.insert(make_pair("c",2)); m.insert(make_pair("d",2)); map<string,int>::iteratorit=m.begin(); while(it!=m.end()) { cout<<(*it).first<<"->"<<(*it).second<<endl; it++; }}

    C++中map和set如何使用

    make_pair:函数模板,不需要像pair一样显示声明类型,而是通过传参自动推导。

    C++中map和set如何使用

    2.2.1.2 统计次数

    1️⃣ 使用find,利用迭代器

    intmain(){ stringarr[]={"北京","武汉","广州","上海","北京","北京","广州", "上海","上海"}; map<string,int>cnt; for(auto&e:arr) { map<string,int>::iteratorfd=cnt.find(e); if(fd==cnt.end()) { cnt.insert(make_pair(e,1)); } else { fd->second++; } } for(auto&e:cnt) { cout<<e.first<<"->"<<e.second<<endl; } return0;}

    C++中map和set如何使用

    2️⃣ 使用[]

    intmain(){ stringarr[]={"北京","武汉","广州","上海","北京","北京","广州", "上海","上海"}; map<string,int>cnt; for(auto&e:arr) { cnt[e]++; } for(auto&e:cnt) { cout<<e.first<<"->"<<e.second<<endl; } return0;}

    C++中map和set如何使用

    [] 可以用来插入、修改、查找

    []->(*((this->insert(make_pair(k,mapped_type()))).first)).second//等价于V&operator[](constK&k){ pair<iterator,bool>ret=insert(make_pair(k,V())); returnret.first->second;}

    这里就可以看出使用[]的时候要注意:如果没有它会直接插入。

    所以我们想插入就可以:

    intmain(){ map<string,int>m; //插入 m["广西"]; m["广东"]=1; for(auto&e:m) { cout<<e.first<<"->"<<e.second<<endl; } return0;}

    C++中map和set如何使用

    当我们想要修改的时候不能用insert,因为只要key相同就会插入失败

    intmain(){ map<string,int>m; //插入 m["广西"]; m["广东"]=1; m.insert(make_pair("广东",2));//插入失败 for(auto&e:m) { cout<<e.first<<"->"<<e.second<<endl; } return0;}

    C++中map和set如何使用

    先要修改可以:

    m["广东"]=2;

    key不在就是插入,key在就是查找。

    2.3 multimap

    intmain(){ multimap<string,int>mm; mm.insert(make_pair("北京",1)); mm.insert(make_pair("北京",2)); mm.insert(make_pair("北京",1)); mm.insert(make_pair("上海",1)); for(auto&e:mm) { cout<<e.first<<"->"<<e.second<<endl; } return0;}

    multimap容器与map容器的底层实现以及成员函数的接口都是基本一致,而multimap的key可以重复注意multimap没有[]

    C++中map和set如何使用

    使用multimap统计次数:

    intmain(){ multimap<string,int>mm; stringarr[]={"北京","武汉","广州","上海","北京","北京","广州", "上海","上海"}; for(auto&e:arr) { map<string,int>::iteratorfd=mm.find(e); if(fd==mm.end()) { mm.insert(make_pair(e,1)); } else { fd->second++; } } for(auto&e:mm) { cout<<e.first<<"->"<<e.second<<endl; } return0;}

    C++中map和set如何使用

    补充:set和map的区别

    • map中的元素是key-value(关键字&mdash;值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。

    • set的迭代器是const的,不允许修改元素的值。map允许修改value,但不允许修改key。其原因是因为map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那么首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效,不知道应该指向改变前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值;而map的迭代器则不允许修改key值,允许修改value值。

    • map支持下标操作,set不支持下标操作。map可以用key做下标,map的下标运算符[ ]将关键码作为下标去执行查找,如果关键码不存在,则插入一个具有该关键码和mapped_type类型默认值的元素至map中,因此下标运算符[ ]在map应用中需要慎用,const_map不能用,只希望确定某一个关键值是否存在而不希望插入元素时也不应该使用,mapped_type类型没有默认值也不应该使用。如果find能解决需要,尽可能用find。

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:C++中map和set如何使用的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:FragmentStatePagerAdapter如何保存恢复下拉刷新Fragment内存数据下一篇:

    8 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18