0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是set?

汽车电子技术 来源:C语言Plus 作者:Maye426 2023-02-27 15:42 次阅读

一、什么是 set?

set 容器,又称集合容器,即该容器的底层是以红黑树变体实现的,是典型的关联式容器。这意味着,set 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。跟任意其它类型容器一样,它能够存放各种类型的对象。

二、容器特性

1.存储结构

set是由多个节点(二叉树中的红黑树变体)组成的。

2.集合

set 容器不能在指定位置插入,意味着不支持at(pos)和[]操作。在set中查找元素,效率是非常高的

multiset与set的区别:set中的元素值唯一,每个元素只能出现一次;而multiset中同一元素可以出现多次。

3.双向迭代器

不支持随机访问迭代器,只能从容器中第一个元素或最后一个元素开始遍历容器,直到找到该位置。

三、基本函数实现

1,构造函数

  • set();创建一个空set
  • set(const set&);复制构造函数
  • set(begin,end);复制[begin,end)区间内的元素,到另一个set中

2.set插入

  • iterator insert(const T& x); 插入元素

3.set删除

  • iterator erase(iterator it);删除集合中迭代器指向元素
  • iterator erase(iterator first,iterator last);删除集合中[first,last)中元素
  • size_type erase(const key_type& elem); 删除指定的元素
  • void clear();清空集合中所有元素

4.查找函数

  • iterator set.find(elem); //查找elem元素,返回指向elem元素的迭代器。

  • size_type set.count(elem); //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。

  • iterator set.lower_bound(elem); //返回第一个>=elem元素的迭代器。

  • iterator set.upper_bound(elem); // 返回第一个>elem元素的迭代器。

  • reverse_iterator rbegin();反向迭代器,指向最后一个元素

  • pair set.equal_range(elem); //返回一对迭代器,这两个迭代器分别用于指向set中大于指定元素的第一个元素,以及等于或大于指定元素的第一个元素。

    equal_range返回值pair是什么?

    • pair.second是pair里面的第二个值,是T2类型。
    • pair.first是pair里面的第一个值,是T1类型。
    • pair存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。
    • pair译为对组,实际上就是一个结构体类型,有两个成员。

5.判断函数

  • bool empty() const;判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。

6.大小函数

  • int size() const;返回集合中元素的个数
  • int max_size() const;返回最大可允许的set元素数量值

7.其他函数

  • void swap(set&);交换两个同类型集合的数据

四、基本用法

#include
#include
using namespace std;
int main()
{
  set<int> s;
  for (int i = 0; i < 10; i++)
  {
    s.insert(rand()%20);
  }
  for (set<int>::iterator it = s.begin(); it != s.end(); it++)
  {
    cout << *it << " ";
  }
  cout <<"\\nset size():"<< s.size() << endl;
  //输出:0 1 2 4 7 9 14 18  为什么只输出8个元素呢?
  //因为set只能存在唯一的元素,重复的会被丢掉
  //思考:为什么set里面的元素是有序的呢?
  //因为set是关联式容器,会默认按照升序进行排列




  //如果找到,返回指向的迭代器,没有找到返回end()迭代器,所以再输出之前
  //需要判断是否找到
  set<int>::iterator it1 = s.find(6);
  if (it1 != s.end())
  {
    cout << *it1 << endl;
  }
  //如果set中有等于4的元素,则返回指向4的迭代器,如果没有返回第一个
  //大于4的元素的迭代器,没有找到返回end()迭代器
  it1 = s.lower_bound(4);
  if (it1 != s.end())
  {
    cout << *it1 << endl;
  }
  //如果set中有大于4的元素,返回第一个大于4的元素的迭代器,没有找
  //到返回end()迭代器
  it1 = s.upper_bound(4);
  if (it1 != s.end())
  {
    cout << *it1 << endl;
  }
  cout <<"------------------我是 C语言Plus 华丽分割线"<
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72779
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21884
  • SET
    SET
    +关注

    关注

    0

    文章

    17

    浏览量

    7828
收藏 人收藏

    评论

    相关推荐

    C++之set/multiset容器

    set/multiset容器又称为关联式容器,底层是通过二叉树实现。set/multiset容器在插入数据时就会做排序处理,默认是从小到大的顺序。其中set容器允许插入重复数据,multiset则不做此限制。
    的头像 发表于 07-17 09:43 309次阅读
    C++之<b class='flag-5'>set</b>/multiset容器

    不同创建线程安全Set的方式

    方法。 使用ConcurrentHashMap工厂方法构造线程安全的HashSet 首先, 我们来看看_ConcurrentHashMap_暴露出来的静态方法 -- newKeySet() 。此方法返回一个Set的实例,等同于实现
    的头像 发表于 09-25 14:20 353次阅读

    MP3set1_48

    MP3set1_48ite
    发表于 04-04 23:26 34次下载

    金融网络中的SET 技术

    SET 协议为网上交易提供了安全技术,使参加交易的各方对网上交易增强了信心,因而大大推动了金融网络的发展。本文在论述SET 技术原理的同时,还给出了应用案例。
    发表于 09-25 16:22 10次下载

    SET协议的一种改进方案

    SET协议在电子商务交易中的应用越来越广泛,本文通过对SET协议的分析,发现存在的一些缺陷,并在此基础上提出了一个改进方案,增强了该协议非否认性、公平性、隐私性等方面的性能,
    发表于 03-02 11:45 7次下载

    IAR-ARM_set相关资料

    IAR-ARM_set相关资料,有需要的下来看看
    发表于 08-16 18:54 6次下载

    SET5样本

    SET5系列是最新研发的内置旁路智能软起动,是完善的电机起动和管理系统。
    发表于 03-22 11:39 4次下载

    微雪电子STLINK-V3SET仿真器简介

    STLINK-V3SET ST 仿真器 下载器 烧录器 支持STM32和STM8全系列 性能提升三倍 型号 STLINK-V3SET
    的头像 发表于 12-20 14:36 1.1w次阅读
    微雪电子STLINK-V3<b class='flag-5'>SET</b>仿真器简介

    vivado多时钟周期约束set_multicycle_path使用

    Vivado下set_multicycle_path的使用说明 vivado下多周期路径约束(set_multicycle_path)的使用,set_multicycle_path一般...
    发表于 12-20 19:12 1次下载
    vivado多时钟周期约束<b class='flag-5'>set</b>_multicycle_path使用

    python之集合set的基本步骤分享

    区别就是remove的元素在set当中没有的话会报错,而discard不会
    的头像 发表于 08-23 10:31 1958次阅读

    2输入异或门-XC7SET86

    2 输入异或门-XC7SET86
    发表于 02-10 19:04 0次下载
    2输入异或门-XC7<b class='flag-5'>SET</b>86

    2输入或门-XC7SET32

    2 输入或门-XC7SET32
    发表于 02-10 19:04 0次下载
    2输入或门-XC7<b class='flag-5'>SET</b>32

    2输入或非门-XC7SET02

    2 输入或非门-XC7SET02
    发表于 02-10 19:05 0次下载
    2输入或非门-XC7<b class='flag-5'>SET</b>02

    逆变器-XC7SET04

    逆变器-XC7SET04
    发表于 02-14 18:39 0次下载
    逆变器-XC7<b class='flag-5'>SET</b>04

    python中的set类型

    Python中的set类型是一种无序、可变的集合数据类型,它的主要特点是不允许重复元素的存在。本文将详尽、详实、细致地介绍set类型的使用场景、常用操作以及与其他类型的比较等方面,以帮助读者全面了解
    的头像 发表于 11-21 16:25 286次阅读