set的简单介绍

set关联式容器;set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。set的内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。

  1. set的插入和删除效率非常高,因为set内部采用链表结构,插入以及删除只需要修改指针,不涉及内存的操作;
  2. 当数据元素增多时,set的插入和搜索速度变化不大,在set中查找是使用二分查找,也就是说,如果有16个元素,最多需要比较4次就能找到结果,有32个元素,最多比较5次。其时间复杂度为 log ⁡ 2 n \log_2n log2​n。

set中常用的方法

  1. begin(); 返回set容器的第一个元素,其中反向遍历用rbegin()
  2. end(); 返回set容器的最后一个元素,其中反向遍历用rend()
  3. clear(); 删除set容器中的所有的元素
  4. empty(); 判断set容器是否为空
  5. max_size(); 返回set容器可能包含的元素最大个数
  6. size(); 返回当前set容器中的元素个数
    Tip: 需要注意的是begin()end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.
  7. count(); 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
  8. erase(iterator); 删除定位器iterator指向的值
  9. erase(first,second); 删除定位器first和second之间的值
  10. erase(key_value); 删除键值key_value的值
  11. insert(key_value); 插入元素

常用操作代码

  1. 插入元素

    set<int> s;
    for(int i=1; i<=10; i++){s.insert(i);
    }
    
  2. 正向遍历
    for(set<int>::iterator it=s.begin(); it!=s.end(); it++){cout<<*it<<endl;
    }
    
  3. 反向遍历
    for(set<int>::reverse_iterator it=s.rbegin(); it!=s.rend(); it++){cout<<*it<<endl;
    }
    
  4. 删除元素
    s.erase(5);    //删除值为5的元素
    s.erase(s.begin());    //删除第一个元素
    s.erase(s.end());    //删除最后一个元素
    s.erase(first_iterator,second_iterator);    //删除两个迭代器之间的值
    //例如
    s.erase(s.begin(), s.end());    //删除所有元素
    
  5. 元素检索:
    set<int> s;
    for(int i=1; i<=10; i++){s.insert(i);
    }
    cout<<*s.find(5)<<endl;
    // 注意返回的并不是下标,因为没有set不是数组,返回的是迭代器,及对应值为value的指针
    

c++中set的介绍及用法相关推荐

  1. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  2. Python中函数的介绍以及用法

    1.函数的介绍 在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数 定义函数的规则: 函数代码块以 def 关键词开头,后接函 ...

  3. HT for Web 中Painter的介绍及用法

    鉴于许多同学对Painter不熟悉,所以撰写此文介绍下.Painter的中文意思是画家.漆工,那放到HT里是什么意思呢?很简单,这是HT特有的一种接口,允许开发者在拓扑及其它通用组件上使用Canvas ...

  4. java bigdecimal赋值_Java中BigDecimal类介绍及用法(亲测)

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...

  5. php中headers,php中get_headers()函数介绍以及用法

    get_headers()是PHP中一个系统级函数,他可以返回一个包含有服务器响应一个HTTP请求所发送的标头的数组.如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息(可用来 ...

  6. CSS中background-attachment的介绍和用法

    background-attachment可以设置在网页滚动时背景图片是否随着网页一起滚动,当一个盒子的高度足够大时,网页会产生滚动条,此时可以使用background-attachment属性来设置 ...

  7. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  8. python数组用sum求和_对python中array.sum(axis=?)的用法介绍

    根据代码中运行的结果来看,主要由以下几种: 1. sum():将array中每个元素相加的结果 2. axis对应的是维度的相加. 比如: 1.axis=0时,对饮搞得是第一个维度元素的相加, [[0 ...

  9. python or的用法_详细介绍Python中and和or实际用法

    and 和 or 的特殊性质 在Python 中,and 和 or 执行布尔逻辑演算,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一.下面来看一下实例.>>> 'a' a ...

最新文章

  1. 怎样使用OpenCV进行人脸识别
  2. python判断奇偶数vscode_安利一波VSCode【vscode这样配置 戴夫看了直呼内行】
  3. 文献记录(part54)--软件缺陷预测中基于聚类分析的特征选择方法
  4. 深度学习基础(二)激活函数
  5. 区间数多属性决策matlab,区间数多属性决策的改进理想解法
  6. Windows下nginx的安装及使用方法入门
  7. C语言指针——基础知识理解
  8. RabbitMq(九) SpringBoot整合RabbitMQ消费者示例代码
  9. python发音1001python发音-python——字符串问题总结
  10. mysql 不等于查询优化_MySQL查询性能优化
  11. 挑战性题目DSCT302:求不同形态的平衡二叉树数目
  12. Oracle数据库以及客户端下载资源
  13. Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
  14. eclipse将安卓项目commit至github本地仓库后,项目bin文件夹下不生成apk且运行报错
  15. 最近越来越当心,是不是自己真的老了。。。
  16. STM32CUBEMX生成KEIL工程后使用AC6(V6)编译加快速度
  17. 现货黄金和纸黄金的区别?
  18. echart显示多组数据
  19. 星辉信息科技教程-Centos上silk微信语音转换成mp3格式
  20. 前端技术之:使用npx创建一个Nuxt.js项目

热门文章

  1. 请相信焦化污水消泡剂的实力,它会帮你把泡沫搞定的
  2. 高通平台 底层驱动GPIO控制
  3. 小程序+企业微信活码群做裂变营销的4个步骤
  4. was环境变量java修改_was无法读取环境变量
  5. uoj 48 核聚变反应强度 次小公因数
  6. 武装突袭3fps服务器不稳定,《武装突袭3》:不像FPS游戏,更像战争
  7. 【colab】谷歌colab免费服务器训练自己的模型,本文以yolov5为例介绍流程
  8. unity 相机控制
  9. 吊打面试官!MySQL灵魂100问,你能答出多少?
  10. 你必须知道的开店做生意那点事