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

news/2024/9/24 23:27:38/
图片名称

博主首页: 有趣的中国人

专栏首页: 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/news/1450866.html

          相关文章

          Vue Cli脚手架—安装Nodejs和Vue Cli

          一&#xff0c;Vue Cli 文档地址: https://cli.vuejs.org/zh/ 二&#xff0c;.环境配置&#xff0c;搭建项目 1.安装node.js 2.下载 node.js10.16.3 地址: https://nodejs.org/en/blog/release/v10.16.3/ 3.安装 node.js10.16.3 , 直接下一步即可, 安装到 d:\program\nodejs…

          基于SSM框架的个人博客系统设计与实现:技术总结

          引言 在数字化时代&#xff0c;个人博客系统已成为展示个人技术见解、分享生活点滴的重要平台。本次博客介绍了一个基于Java的个人博客系统的设计与实现&#xff0c;采用了流行的SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;技术栈&#xff0c;以及MySQL数据库和JS…

          七、Google Protobuf

          这里写自定义目录标题 一、编码和解码二、Netty本身的编码解码机制和存在的问三、Protobuf四、Protobuf示例1五、ProtoBuffer传输多种数据类型 一、编码和解码 二、Netty本身的编码解码机制和存在的问 netty提供的编码器 netty提供的解码器 存在的问题 无法跨语言序列化后…

          软件测试面试之常见编程算法笔试题

          1.请写出冒泡排序。 #冒泡排序&#xff1a;n*n def bubbleSort(array):maxindex len(array)-1maxValue array[maxindex]k0while maxindex:for i in range(1,maxindex):if array[i-1]>array[i]:temp array[i]array[i] array[i-1]array[i-1] tempk1maxindex -1print(k)re…

          Python IDE(集成开发环境)有很多,以下是一些常用的选项

          Python IDE&#xff08;集成开发环境&#xff09;有很多&#xff0c;以下是一些常用的选项&#xff1a; PyCharm&#xff1a;PyCharm被认为是普及率和使用率最高的一款Python IDE集成开发环境工具。它功能强大&#xff0c;支持多种开发模式&#xff0c;如科学计算、Web开发、数…

          上海计算机学会2022年4月月赛C++丙组T3平衡括号(简)

          题目描述 给定一个只包含 ( 与 ) 的括号序列&#xff0c;请删除尽量少的括号&#xff0c;使它变成平衡的。平衡的定义如下&#xff1a; 空序列是平衡的&#xff1b;如果某个括号序列 s 是平衡的&#xff0c;那么 (s) 也是平衡的&#xff1b;如果某两个括号序列 s 与 t 都是平…

          webpack 常用插件

          clean-webpack-plugin 这个插件的主要作用是清除构建目录中的旧文件&#xff0c;以确保每次构建时都能得到一个干净的环境。 var { CleanWebpackPlugin } require("clean-webpack-plugin") const path require("path");module.exports {mode: "de…

          mysql binlog入门

          binlog 什么是binlog binlg记录了所有的表结构变更&#xff08;CREATE、ALTER TABLE…&#xff09;以及表数据修改&#xff08;INSERT、UPDATE、DELETE…&#xff09;&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间。 简单的说就是&#xff0c;只要对…