C++(四十九) — set、multiset 容器的基本操作

 1、set

  set的特性是:所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值

  set的各成员函数列表如下:

1. begin():返回指向第一个元素的迭代器;end():返回指向最后一个元素的迭代器;

2.empty():如果集合为空,返回true;clear():清除所有元素;

3. erase():删除集合中的元素

  • erase(iterator) :删除定位器iterator指向的值
  • erase(first,second):删除定位器first和second之间的值
  • erase(key_value):删除键值key_value的值

4. count():返回某个值元素的个数,0或1;

5. find():返回一个指向被查找到元素的迭代器,如果没找到则返回end()。

6. insert():在集合中插入元素

  • insert(key_value);将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
  • inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.

7. lower_bound(key_value):返回第一个大于等于key_value的定位器;upper_bound(key_value),返回最后一个大于key_value的定位器

8. size():集合中元素的数目;

9. max_size():返回集合能容纳的元素的最大限值

10. swap():交换两个集合变量

11. rbegin():返回指向集合中最后一个元素的反向迭代器.; rend():返回指向集合中第一个元素的反向迭代器

12. equal_range()--返回集合中与给定值相等的上下限的两个迭代器

13. get_allocator()--返回集合的分配器

14. key_comp()--返回一个用于元素间值比较的函数

15. upper_bound()--返回大于某个值元素的迭代器

16. value_comp()--返回一个用于比较元素间的值的函数

反向迭代器:set<int>::reverse_iterator

  关于set有下面几个问题:

(1)为何map和set的插入删除效率比用其他序列容器高?

  大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动。说对了,确实如此。set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点。结构图可能如下:

  A
   / \
  B C
 / \ / \
  D E F G

因此插入的时候只需要稍做变换,把节点的指针指向新的节点就可以了。删除的时候类似,稍做变换后把指向删除节点的指针指向其他节点也OK了。这里的一切操作就是指针换来换去,和内存移动没有关系。

(2)为何每次insert之后,以前保存的iterator不会失效?

  iterator这里就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使时push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。

(3)当数据元素增多时,set的插入和搜索速度变化如何?

  如果你知道log2的关系你应该就彻底了解这个答案。在set中查找是使用二分查找,也就是说,如果有16个元素,最多需要比较4次就能找到结果,有32个元素,最多比较5次。那么有10000个呢?最多比较的次数为log10000,最多为14次,如果是20000个元素呢?最多不过15次。看见了吧,当数据量增大一倍的时候,搜索次数只不过多了1次,多了1/14的搜索时间而已。你明白这个道理后,就可以安心往里面放入元素了。

还要注意begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.

自定义比较函数
    (1)元素不是结构体:
        例:
        //自定义比较函数myComp,重载“()”操作符

[cpp] view plain copy

  1. struct myComp
  2. {
  3. bool operator()(const your_type &a,const your_type &b)
  4. [
  5. return a.data-b.data>0;
  6. }
  7. }
  8. set<int,myComp>s;
  9. ......
  10. set<int,myComp>::iterator it;

(2)如果元素是结构体,可以直接将比较函数写在结构体内。
        例:

[cpp] view plain copy

    1. struct Info
    2. {
    3. string name;
    4. float score;
    5. //重载“<”操作符,自定义排序规则
    6. bool operator < (const Info &a) const
    7. {
    8. //按score从大到小排列
    9. return a.score<score;
    10. }
    11. }
    12. set<Info> s;
    13. ......
    14. set<Info>::iterator it;

原文地址:https://www.cnblogs.com/eilearn/p/10992783.html

时间: 2024-10-09 20:01:23

C++(四十九) — set、multiset 容器的基本操作的相关文章

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好

QT开发(四十九)——数据库用户接口层

QT开发(四十九)--数据库用户接口层 用户接口层主要包括Qt SQL模块中的QSqlQueryModel.QSqlTableModel.QSqlRelationalTableModel.用户接口层的类实现了将数据库中的数据链接到窗口部件上,是使用模型/视图框架实现的,是更高层次的抽象,即便不熟悉SQL也可以操作数据库.需要注意的是,在使用用户接口层的类之前必须先实例化QCoreApplication对象. QT中使用了自己的机制来避免使用SQL语句,提供了更简单的数据库操作及数据显示模型,分别

第四十九象 壬子

第四十九象 壬子 谶 曰山谷少人口 欲剿失其巢帝王称弟兄 纷粉是英豪 颂 曰一个或人口内啼分南分北分东西六爻占尽文明见棋布星罗日月济 金圣叹注解:久分必合,久合必分,理数然也,然有文明之象,当不如割据者之纷扰也. 推背图网解: 解图八把刀,显然八位能人各居一方.刀非指武力统治,下文有“文明”象,这里刀在八卦中表兑卦,兑为口,显然是通过舆论宣传法律.社会公德在治理各自的“行政区”. 解谶山谷少人口 欲剿失其巢——“谷”字少了人.口剩下“八”:“剿”少了巢剩下“刀”旁,暗示割据自治有八方.  帝王称

鲁迅散文——随感录四十九

随感录四十九 凡有高等动物,倘若没有遇着意外的变故,总是从幼到壮,从壮到老,从老到死. 我们从幼到壮,既然毫不为奇的过去了:自此以后,自然也该毫不为奇的过去. 可惜有一种人,从幼到壮,居然也毫不为奇的过去了:从壮到老,便有点古怪:从老到死,却更是奇想天开,要占尽了少年的道路,吸尽了少年的空气. 少年在这时候,只能先行萎黄,且待将来老了,神经血管一切变质以后,再来活动.所以社会上的状态,先是"少年老成":直待弯腰曲背时期,才更加"逸兴遄飞",似乎从此以后,才上了做人的

第四十九章

第四十九章1 圣人无心,将心比心 圣人恒无心,以百姓之心为心. 优秀的领导者自己的心是空的,把老百姓的心作为自己的心. 领导者要换位思考,想老板姓所想.要学会将心比心. 各位朋友大家好,今天我们接着来聊<道德经>. 不知道各位双十一过得怎么样?大家都买了很多东西吧?双十一那天我开玩笑,我发一个微博,我还在自己朋友圈里发了个微信,在我朋友圈说,双十一大酬宾了,我讲的<道德经>200多期,全部今天免费.我是搞笑,结果真有的网友留言,真的吗?太好了,我一看我晕了,我说我是开玩笑,他真的一

Python进阶(四十九)-初识Flask Blueprint

Python进阶(四十九)-初识Flask Blueprint 前言   在进行Python Web开发时选择Flask框架.项目模块划分阶段,使用Blueprint(这里暂且称之为“蓝本”).Blueprint通过把实现不同功能的module分开,从而把一个大的application分割成各自实现不同功能的module.在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名.   Blueprint还有其他好处,其本质上来说就

七七四十九劫,九九八十一难

蒙差揭谛皈依旨 谨记唐僧难数清 金蝉遭贬第一难 出胎几杀第二难 满月抛江第三难 寻亲报冤第四难 出城逢虎第五难 折从落坑第六难 双叉岭上第七难 两界山头第八难 陡涧换马第九难 夜被火烧第十难 失却袈裟十一难 收降八戒十二难 黄风怪阻十三难 请求灵吉十四难 流沙难渡十五难 收得沙僧十六难 四圣显化十七难 五庄观中十八难 难活人参十九难 贬退心猿二十难 黑松林失散二十一难 宝象国捎书二十二难 金銮殿变虎二十三难 平顶山逢魔二十四难 莲花洞高悬二十五难 乌鸡国救主二十六难 被魔化身二十七难 号山逢怪二

JavaWeb学习总结(四十九)——简单模拟Sping MVC

在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: 1 /** 2 * 使用Controller注解标注LoginUI类 3 */ 4 @Controller 5 public class LoginUI { 6 7 //使用RequestMapping注解指明forward1方法的访问路径 8 @RequestMapping("LoginUI/Lo

受Note 7影响 三星在声誉排名中已从第三跌至第四十九

The Verge 中文站 2 月 20 日报道 去年,由于 Note 7 燃损事故,三星在美国消费者心目中的声誉受到了巨大打击.著名的哈里斯民意调查最新数据显示,三星在民众心中的声誉排名已经跌至第 49 名,而在上次的评比中,三星排名比苹果和谷歌都高,列在榜单第三位. 在本次民调中,亚马逊再次夺魁,紧随其后的是 Wegmans 和 Publix 两个超市品牌.其他科技公司中,进入前十的还有苹果.谷歌和特斯拉.此外,Netflix 和微软分别排名第 18 和第 20,Facebook 则排在第