【C++】STL——set的介绍和使用、set的构造函数、set的迭代器、set的容量和增删查改函数

news2024/11/16 12:58:21

文章目录

  • 1.set的介绍
  • 2.set的使用
    • 2.1set的构造函数
    • 2.2set的迭代器
    • 2.3set的容量函数
    • 2.4set的增删查改函数

1.set的介绍

set的介绍

在这里插入图片描述
              

  (1)set是按照一定次序存储元素的容器。

  (2)在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。

  (3)在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。

  (4)set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

  (5)set在底层是用二叉搜索树实现的。

              

2.set的使用

在这里插入图片描述

  set提供的模版参数列表:

  T: set中存放元素的类型,实际在底层存储<value, value>的键值对。

  Compare:set中元素默认按照小于来比较。

  Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

              

2.1set的构造函数

在这里插入图片描述


  set提供了三种构造函数:

函数声明功能介绍
set (const Compare& comp = Compare(), const Allocator& = Allocator() );构造空的set
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator(());用[first, last)区间中的元素构造set
set ( const set<Key,Compare,Allocator>& x);set的拷贝构造

  以下是一些set构造函数的简单示例:

//1.默认构造函数:
std::set<int> mySet; // 创建一个空的set,元素类型为int

//2.使用迭代器构造:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::set<int> mySet(vec.begin(), vec.end()); // 使用vector的迭代器构造set

//3.拷贝构造函数:
std::set<int> mySet1 = {1, 2, 3};
std::set<int> mySet2(mySet1); // 使用另一个set进行拷贝构造

              

2.2set的迭代器

在这里插入图片描述

在这里插入图片描述


  set同样提供了很多的迭代器:

函数声明功能介绍
iterator begin()返回set中起始位置元素的迭代器
iterator end()返回set中最后一个元素后面的迭代器
const_iterator cbegin() const返回set中起始位置元素的const迭代器
const_iterator cend() const返回set中最后一个元素后面的const迭代器
reverse_iterator rbegin()返回set第一个元素的反向迭代器,即end
reverse_iterator rend()返回set最后一个元素下一个位置的反向迭代器,即rbegin
const_reverse_iterator crbegin() const返回set第一个元素的反向const迭代器,即cend
const_reverse_iterator crend() const返回set最后一个元素下一个位置的反向const迭代器,即crbegin

  下面是一个使用这些迭代器的示例:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet = {1, 2, 3, 4, 5};

    // 使用正向迭代器遍历set
    std::cout << "正向遍历: ";
    for (auto it = mySet.begin(); it != mySet.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用反向迭代器遍历set
    std::cout << "反向遍历: ";
    for (auto it = mySet.rbegin(); it != mySet.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用const迭代器遍历set
    std::cout << "const遍历: ";
    for (auto it = mySet.cbegin(); it != mySet.cend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用const反向迭代器遍历set
    std::cout << "const反向遍历: ";
    for (auto it = mySet.crbegin(); it != mySet.crend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//正向遍历: 1 2 3 4 5 
//反向遍历: 5 4 3 2 1 
//const遍历: 1 2 3 4 5 
//const反向遍历: 5 4 3 2 1 

              

2.3set的容量函数

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

  set常用的容量函数:

函数声明功能介绍
bool empty ( ) const检测set是否为空,空返回true,否则返回true
size_type size() const返回set中有效元素的个数
#include <iostream>
#include <set>

int main() {
    std::set<int> mySet;

    if (mySet.empty()) {
        std::cout << "set为空" << std::endl;
    } else {
        std::cout << "set不为空" << std::endl;
    }

    mySet.insert(1);
    mySet.insert(2);
    mySet.insert(3);

    if (mySet.empty()) {
        std::cout << "set为空" << std::endl;
    } else {
        std::cout << "set不为空" << std::endl;
    }

    std::cout << "set中元素的个数为: " << mySet.size() << std::endl;
    
    return 0;
}

//set为空
//set不为空
//set中元素的个数为: 3

              

2.4set的增删查改函数

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

函数声明功能介绍
pair<iterator,bool> insert ( const value_type& x )在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false>
void erase ( iterator position )删除set中position位置上的元素
size_type erase ( const key_type& x )删除set中值为x的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )删除set中[first, last)区间中的元素
void swap ( set<Key,Compare,Allocator>& st );交换set中的元素
void clear ( )将set中的元素清空
iterator find ( const key_type& x ) const返回set中值为x的元素的位置
size_type count ( const key_type& x ) const返回set中值为x的元素的个数

  set中的insert()函数用于向set中插入元素,它有多种重载形式。示例如下:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet;

    // 插入单个元素
    mySet.insert(1);

    // 插入多个元素
    mySet.insert({2, 3, 4});

    // 插入范围内的元素
    std::set<int> anotherSet = {5, 6, 7};
    mySet.insert(anotherSet.begin(), anotherSet.end());

    // 输出set中的元素
    for (auto it = mySet.begin(); it != mySet.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//1 2 3 4 5 6 7


  set中的erase()函数用于删除set中的元素,它也有多种重载形式。示例如下:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet = {1, 2, 3, 4, 5};

    // 删除指定元素
    mySet.erase(3);

    // 删除指定范围内的元素
    mySet.erase(mySet.begin(), mySet.find(4));

    // 输出set中的元素
    for (auto it = mySet.begin(); it != mySet.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//4 5

              

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/908965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LTDC之外部SDRAM

1.配置外部SDRAM&#xff08;嵌入式基础知识&#xff0c;此处不做分析&#xff09; 2.编写SDRAM配置代码&#xff08;copy正点原子例程&#xff09; sdram.c#include "sdram.h" #include "fmc.h"uint8_t SDRAM_Send_Cmd(uint8_t bankx,uint8_t cmd,uint8_…

区块链与算力网络:创造未来网络的安全与共享

在数字革命的浪潮下&#xff0c;网络技术正焕发着前所未有的活力&#xff0c;而算力网络以其独特的区块链技术应用&#xff0c;为网络的安全性和资源共享带来了新的可能性。本文将带您深入探索算力网络中区块链技术的神奇应用&#xff0c;为您呈现这个充满活力和创新的网络未来…

全方位介绍SRM系统供应商采购管理

SRM系统是一种用于管理与供应商合作关系的解决方案。本文将全面介绍SRM系统供应商采购管理的概念、重要性、功能模块以及应用优势&#xff0c;以帮助企业了解如何通过SRM系统提升采购管理效率和供应链合作关系。 一、SRM系统供应商采购管理概述 1.1 什么是SRM系统供应商采购管…

19 真实的战场:如何在大型项目中涉及GUI自动化测试策略

大型全球化电商网站 GUI 测试的策略设计 组件 -> 模块 -> 端到端 1&#xff09; 首先&#xff0c;要从前端组件的级别来保证质量&#xff0c;也就是需要对那些自定义开发的组件进行完整全面的测试。通常前端组件会基于 Jest 做比较严格的单元测试。 Jest 是由 Facebook 发…

内网渗透神器CobaltStrike之Profile文件编写(十)

简介 在网络渗透测试和红队模拟攻击中&#xff0c;隐藏命令与控制&#xff08;C2&#xff09;流量的特征对于成功绕过入侵检测系统至关重要。Cobalt Strike提供了一个强大的工具——Malleable C2 profiles&#xff0c;用于自定义C2流量&#xff0c;从而使其看起来像正常的网络…

docker搭建opengrok环境2

引言&#xff1a; 虚拟机关闭后重新开启&#xff0c;理论上是需要重新启动一下docker的&#xff0c;以重新启动其中的服务。 命令基础&#xff1a; docker images&#xff1a;查看docker中现有的镜像 docker container ls -all&#xff1a;查看docker中目前在运行的containe…

Centos7 交叉编译QT5.9.9源码 AArch64架构

环境准备 centos7 镜像 下载地址&#xff1a;http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ aarch64交叉编译链 下载地址&#xff1a;https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/ QT5.9.9源代码 下载地址&#xff1…

现货白银投资什么的?

也许很多投资者听说过现货白银&#xff0c;但并不知道它投资的是什么&#xff0c;过程中是如何进行买卖的&#xff0c;也不知道如果参与其中&#xff0c;自己需要承担什么风险&#xff0c;最终的收益会如何。对于上述的这些问题本文&#xff0c;将为大家简单地介绍一下。 虽然现…

Linux文件类型

注意&#xff1a; 硬链接&#xff0c;与软链接相似&#xff0c;但不是特殊的文件类型。 只能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引&#xff08;也称为inode&#xff09;。当 移动或者删除原始文件时&#xff0c;硬链接不 会被破坏&#xff0c;因为它…

基于JJWT理解JWT,JWS,JWE

JWT &#xff0c; 全写JSON Web Token, 是开放的行业标准RFC7591&#xff0c;用来实现端到端安全验证. 从开发者理解的角度来说&#xff1a; JWT 是一个定义传递信息的标准JWT 的Token是一个Base64编码的字符串&#xff0c; 类似 eyJhbGciOiJIUzI1NyJ9.eyJzdWIiOiJvc2NhciJ9.…

Vue下载及配置(Vue文件和路由文件)

目录 Vue文件2.7.14版本&#xff1a; Vue路由&#xff1a; 结束&#xff1a; Vue文件2.7.14版本&#xff1a; Vue 不支持 IE8 及以下版本&#xff0c;因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容ECMAScript5的浏览器 Vue文件下载地址&#xff1a;安…

openLayers实战(九):正多边形的绘制

最近在绘制各种图形&#xff0c;越来越乱&#xff0c;看了很多文章&#xff0c;启发了从最最基础的图形开始学习扩展。 遇到什么样的问题&#xff1f; import ol from "ol"; import { Draw } from "ol/interaction"; import { Vector as VectorSource } f…

帆软报表开发-快速入门

帆软学习&#xff1a;帆软学院-培养企业亟需的数据人才 第一章 初识FineReport 1、初识FineReport 1.1、FineReport 是什么&#xff1f; FineReport 是一款简单、高效、智能的报表工具&#xff0c;用以快速搭建的企业级Web报表平台。 FineReport 报表主要功能介绍 ① 主要…

Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO

前言 Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部分代码。 1. 安装Livox-SDK2 参考官方教程。 1.1. 安装CMake sudo apt install cmake1.2. 安装编译Livox-SDK2 git clone https://github…

BDA初级分析——可视化图形

一、时间趋势 时间趋势要如何呈现&#xff1f; Excel函数补充 YEAR&#xff1a;提取日期中的年份MONTH&#xff1a;提取日期中的月份DAY&#xff1a;提取日期中的天HOUR&#xff1a;提取时间中的小时 TEXT&#xff1a;将数值转换为按指定数字格式表示的函数 写法&#xff1…

关于lattice planner

使用编程创建驾驶场景。 1.使用Driving scenario Designer 交互方式创建驾驶场景 2.导出matalb function 3.修正这个函数&#xff0c;创建原始场景的变体。 4.调用这个函数&#xff0c;生成drivingScenario object。 5.在simulink中仿真&#xff0c;导入这个objcet &…

无涯教程-PHP - File 函数

文件系统功能用于访问和操纵文件系统&#xff0c;PHP为您提供了操纵文件的所有功能。 运行时配置 这些功能的行为受php.ini中的设置影响。 NameDefaultChangeableChangelogallow_url_fopen"1"PHP_INI_ALLPHP_INI_ALL in PHP < 4.3.4. PHP_INI_SYSTEM in PHP &l…

网络编程(IO模型)

一、阻塞IO 1.最常用&#xff0c;最简单&#xff0c;效率最低的。 2.创建套接字文件描述符后&#xff0c;默认处于阻塞IO模式; 3.read, write, recv, send, recvfrom ,sendto&#xff0c;accept 二. 非阻塞IO 1.防止进程阻塞在IO函数上&#xff0c;但是如果想要获取到有效…

WebRTC音视频通话-iOS端调用ossrs直播拉流

WebRTC音视频通话-iOS端调用ossrs直播拉流 之前实现iOS端调用ossrs服务&#xff0c;文中提到了推流。没有写拉流流程&#xff0c;所以会用到文中的WebRTCClient。请详细查看&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132257196 一、iOS播放端拉流效果 二…

A*算法图文详解

基本概念 A*算法最早于1964年在IEEE Transactions on Systems Science and Cybernetics中的论文《A Formal Basis for the Heuristic Determination of Minimum Cost Paths》中首次提出。其属于一种经典的启发式搜索方法&#xff0c;所谓启发式搜索&#xff0c;就在于当前搜索…