【C++ 容器 set】set的相关用法

ops/2024/9/26 1:23:25/
图片名称

博主首页: 有趣的中国人

专栏首页: C++进阶

其它专栏: C++初阶 | 初阶数据结构 | Linux

博主会持续更新

    本篇文章主要讲解 C++容器set的相关用法 的相关内容

    文章目录

    • 1. 关联式容器
    • 2. 树形结构的关联式容器
    • 3. set的介绍以及相关使用操作
      • 3.1 set的介绍
      • 3.2 set的相关使用操作
        • `set的模板参数列表`
        • `set的功能`
        • `set的构造函数`
        • `set的删除`
        • `set的查找`
        • `lower_bound和upper_bound`


      1. 关联式容器


      我已经在之前介绍过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。

      关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>(上一篇文章讲过)结构的键值对,在数据检索时比序列式容器效率更高。


        2. 树形结构的关联式容器


        根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。首先来看一下set


          3. set的介绍以及相关使用操作

          3.1 set的介绍


          链接:set介绍

          1. 唯一性: std::set 中的元素是唯一的,即集合中不允许重复元素。

          2. 排序: std::set 会根据元素的值自动进行排序,默认情况下,它使用元素类型的比较函数来实现排序。

          3. 内部实现: std::set 使用红黑树作为底层数据结构来实现,这使得它的插入、删除和查找操作的时间复杂度都是 O(log n)

          4. 使用方法: 要使用 std::set,首先需要包含 <set> 头文件。然后,你可以声明一个 std::set 对象,并使用Insert() 方法向其中插入元素。你还可以使用 erase() 方法来删除元素,使用 find() 方法来查找元素,以及使用size() 方法获取集合的大小。

          5. 迭代器: std::set 支持迭代器,你可以使用迭代器遍历集合中的元素,并对其进行操作。

          6. 自定义排序: 如果你想要按照自定义的方式对元素进行排序,可以提供自定义的比较函数作为 std::set 的模板参数之一。

          3.2 set的相关使用操作

          set的模板参数列表

          在这里插入图片描述

          • : set中存放元素的类型,实际在底层存储<value, value>的键值对。
          • Compare:set中元素默认按照小于来比较
          • Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

          set的功能

          • set可以帮你完成去重+排序,例如:
          void settest1()
          {set<int> s1;s1.insert(1);s1.insert(11);s1.insert(3);s1.insert(1);s1.insert(4);s1.insert(2);for (auto e : s1){cout << e << " ";}
          }
          

          在这里插入图片描述

          set的构造函数

          在这里插入图片描述

          • 迭代器区间构造:
          void settest1()
          {vector<int> v = { 3,2,8,1,10,2 };set<int> s2(v.begin(), v.end());for (auto e : s2){cout << e << " ";}cout << endl;
          }
          

          在这里插入图片描述

          • Initializer_list构造:
          void settest1()
          {set<int> s3 = { 3,2,8,1,10,2 };for (auto e : s3){cout << e << " ";}cout << endl;
          }
          

          set的删除

          在这里插入图片描述

          void settest1()
          {set<int> s3 = { 3,2,8,1,10,2 };for (auto e : s3){cout << e << " ";}cout << endl;s3.erase(8);s3.erase(18);for (auto e : s3){cout << e << " ";}cout << endl;
          }
          

          在这里插入图片描述

          set的查找

          在这里插入图片描述

          void settest1()
          {set<int> s3 = { 3,2,8,1,10,2 };for (auto e : s3){cout << e << " ";}cout << endl;s3.erase(8);s3.erase(18);for (auto e : s3){cout << e << " ";}cout << endl;auto pos = s3.find(10);if (pos != s3.end()){cout << *pos << endl;s3.erase(pos);}else{cout << "找不到" << endl;}for (auto e : s3){cout << e << " ";}cout << endl;
          }
          

          在这里插入图片描述

          lower_bound和upper_bound

          在这里插入图片描述
          在这里插入图片描述

          • lower_bound>= x 的值,返回第一个 >= x 的值的位置
          • upeer_bound>x 的值,返回第一个 >x 的值的下一个位置
          void settest2()
          {std::set<int> myset;for (int i = 1; i < 10; i++)myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90for (auto e : myset){cout << e << " ";}cout << endl;auto itlow = myset.lower_bound(25);                // >= xauto itup = myset.upper_bound(60);                 // > x// [30, 70)myset.erase(itlow, itup);                     // 10 20 70 80 90for (auto e : myset){cout << e << " ";}cout << endl;
          }
          

          在这里插入图片描述


          http://www.ppmy.cn/ops/29146.html

          相关文章

          使用webpack给大屏自适应插件autofit.js增加umd打包方式

          最近有个大屏自适应的需求&#xff0c;而且想直接通过script标签来引入自适应的插件js&#xff0c;搜索相中了autofit.js&#xff0c;可惜不支持umd格式的引入&#xff0c;虽然也能直接copy源码&#xff0c;但是还是折腾下给它打包成umd格式的代码。 fork源码&#xff0c;克隆…

          rust语言tokio库spawn, blocking_spawn等的使用

          目录 tokio的spawn以及spawn_blocking的使用tokio::task::spawn方法解析tokio::task::spawn_blocking()方法解析 时间会遗忘一切 最后更新时间2024.04.29 tokio版本&#xff1a; tokio的spawn以及spawn_blocking的使用 tokio::task::spawn方法解析 tokio的实现原理以及源码…

          【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(70)

          1. 题目解析 题目链接&#xff1a;740. 删除并获得点数 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 问题分析 本题是「打家劫舍」问题的变种&#xff0c;但核心逻辑依然保持一致。题目要求从给定的数组nums中选择…

          python flask 假死情况处理+https证书添加

          前言 当使用flask编写了后台程序跑在服务器端的时候&#xff0c;有时候虽然后台中显示在运行&#xff0c;但是页面无法访问&#xff0c;出现这个情况可以使用如下方法修改代码&#xff0c;进而防止假死&#xff0c;另外记录下flask下证书的添加。 假死处理 出现进程存在&…

          为什么推荐金融平台上DDOS安全防护方案

          为什么推荐金融平台上DDOS安全防护方案&#xff1f;随着金融科技的迅猛发展&#xff0c;金融平台已成为我们生活中不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;金融平台也面临着日益严峻的安全威胁&#xff0c;其中DDOS攻击尤为突出。因此&#xff0c;推荐金融平台…

          C++入门系列-内联函数

          &#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内敛函数的地方展开&#xff0c;这就意味着使用内联函数可以提升程序的运行的效率&#xff0c;减小了调用所需…

          《21天学通C++》(第十四章) 宏和模板介绍(1)

          1.使用#define定义常量 例子 #include <iostream> #include <string> using namespace std;#define ARRAY_LENGTH 25 #define PI 3.1415 #define MY_DOUBLE double #define FAV_WHISKY "Jack"int main() {int number [ARRAY_LENGTH]{0};cout<<&q…