STL中set的基本介绍

2023-11-07

STl中的基本内容

容器

set/multiset

在集合中,所有的元素只能出现一次,并且默认按照元素的值从小到大自动排序

set不能通过迭代器来修改元素的值,即set的迭代器是一种const_iterator

multiset 和 set 的区别在于multiset中允许有重复的元素

内部采用的是一种非常高效的平衡检索二叉树:黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。这种结构使得集合在进行插入删除的时候,具有较高的效率,它不需要移动其他的元素,只需要改变个别元素之间的连接关系。同时,正式因为如此,在插入删除的过程中不会发生元素内存地址的改变(例如,如果在vector容器中,当加入的元素已经大于容器原来的最大容量时,就需要为容器申请新的更大的内存空间,并将之前的内容拷贝过去,这既降低了效率,又使得之前获取的迭代器失效),之前保存下来的迭代器仍然指向原来的内存地址,因此不会发生迭代器失效的问题。

set的声明和赋值
set<int> st;  //声明了一个int类型的集合 默认元素按照从小到大的顺序排序
set<int,cmp> stt;  //声明的stt集合中,元素按照cmp中规定的顺序进行排序
set<int> st_copy(st);  //使用拷贝构造函数
set<int> s_t;
swap(st,s_t);  //交换两个集合中的元素
set的大小和空判断
st.size();  //返回集合的大小也就是元素的个数
st.empty();  //返回集合是否为空,如果是空返回为真
set的插入操作
for(int i=10;i>0;i--)
    st.insert(i);   //按顺序插入,但是set中的顺序为从小到大
for(set<int>::iterator it=st.begin();it!=st.end();it++)
    cout<<*it<<" ";   //1 2 3 4 5 6 7 8 9 10

st.insert(it_begin,it_end);  //把[it_begin,it_end)区间内的值插入到st中

//由于集合中的元素只能出现一次,在执行st.insert(5);其实是没有进行操作的
pair<set<int>::iterator,bool> test=st.insert(5);
if(test.second)
    cout<<"插入成功"<<endl;
else
    cout<<"插入失败"<<endl;
//输出结果为插入失败
set的删除操作
st.erase(key);  //删除集合中值为5的元素
st.erase(it_begin,it_end);  //删除集合中[it_begin,it_end)之间的元素
st.erase(index);  //删除迭代器index所指向位置的元素
st.clear();  //删除集合中的全部元素
set的查找操作
st.find(key);  //在集合中查找键key是否存在,若存在则返回指向该位置处的迭代器,若不存在,则返回st.end()
st.count(key);  //返回值为集合中键key的元素个数 在set中只能是0/1
st.upper_bound(key);  //返回第一个键大于key的元素的迭代器
st.lower_bound(key);  //返回第一个键大于等于key的元素的迭代器
st.equal_range(key);  //返回集合中键与key相当的上下限的两个迭代器
下面来一个完整的示例
#include <iostream>
#include <set>
using namespace std;
class Student {
public:
    Student(char x, int y) :name(x), score(y) {};
    char name;
    int score;
    bool operator <(const Student& c) const
    {
        return this->score < c.score;
    }

};
struct cmp {
    bool operator()(Student a1, Student a2) const
    {
        return a1.score > a2.score;
    }
};
void show(set<Student> s)
{
    for (set<Student>::iterator it = s.begin(); it != s.end(); it++) 
        cout << it->name << " " << it->score << endl; 
    cout << endl;
}
void show(set<Student, cmp> s)
{
    for (set<Student>::iterator it = s.begin(); it != s.end(); it++)
        cout << it->name << " " << it->score << endl; 
    cout << endl;
}
int main()
{
    //按照自定义规则排序
    set<Student> s;
    set<Student, cmp> rs;
    for (int i = 0; i <= 5; i++)
        s.insert(Student('a'+i, (i+1)*10)), rs.insert(Student('a'+i, (i+1)*10));
    show(s);  //按照成绩升序排列
    show(rs);  //按照成绩降序排列
    rs.erase(rs.find(Student('d', 40)));  //删除('d',40)的元素
    show(rs); 
    s.erase(s.begin(), s.upper_bound(Student('b', 20)));  //删除所有成绩不大于20的元素
    show(s);
    while (!s.empty())  s.erase(s.begin());  //清空集合
    rs.clear();  //清空集合
}

运行结果如下

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL中set的基本介绍 的相关文章

  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is

    原文错误提示 emulator ERROR x86 emulation currently requires hardware acceleration Please ensure Intel HAXM is properly instal
  • ege库基于前中后序动态建立二叉树、序列检错以及查找公共父节点C++

    一 需求分析 1 任意输入前序 中序序列或者中序 后序序列 生成二叉树 3 利用打印二叉树功能显示二叉树的逐步构造过程 使用自上而下的二叉树显示 4 使用EGE xege org SFML www sfml dev org download
  • 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN

    因为这几个月饭店生意恢复 加上研究 Faster RCNN 用掉了很多时间 就没有更新博客了 这篇开始会介绍对象识别的模型与实现方法 首先会介绍最简单的 RCNN 与 Fast RCNN 模型 下一篇会介绍 Faster RCNN 模型 再
  • 如何利用双休日,每月稳定增加额外1500元收入?

    针对8种不同标签的人群 良心推荐12个稳定增加收入的副业 最短一天就能有收入 月入几千的大有人在 认真看有干货 很可能会成为你的主业 最好先点赞收藏 以免后面找不到 不管你是上班族还是学生党 一个副业除了可以帮助你赚钱 更重要的是给了你平淡
  • 国家开源软件资源库

    http yp oss org cn software show cat php cat id 5 基本信息 成熟度 Dimdim 2009 05 19 1 2 3 4 5 6 7
  • C++模板详解

    目录 1 什么是c 的模板 2 模板的概念 3 函数模板 1 什么是函数模板 2 函数模板的定义格式 3 案例 4 函数模板的实例化 1 隐式实例化 2 显式实例化 5 函数模板的重载 6 函数模板与普通函数小结 7 使用函数模板要注意的问
  • 将生成的pandas DataFrame数据写入excel的指定位置

    在文件中生成了DataFrame格式数据想要写入excel的指定位置 比如第三行的第二列 网上的方法基本是使用to excel直接写入 这样写入的位置就是固定的 不能指定位置 通过openpyxl灵活设置的方式写入数据 这种方式对传统的中国
  • LoadLibrary错误182

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 一 问题描述 在win7下用一个MFC程序把从XP拷过来的msgina dll加载起来 调用LoadLibrary后返回错误码为 二 解决
  • 二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

    前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了 这里是文章链接 https blog csdn net qq 45894840 article details 129490504 spm 1001 2014
  • 【python练习题 02】按身高和体重排队

    题目 某学校举行运动会 学生们按编号 1 2 3 n 进行标识 现需要按照身高由低到高排列 对身高相同的人 按体重由轻到重排列 对于身高体重都相同的人 维持原有的编号顺序关系 请输出排列后的学生编号 输入 两个序列 每个序列由n个正整数组成
  • Q-learning

    学习增强学习有段时间了 也接触了 learning了 但对此理解不是很透彻 知道看到头条文章对一篇 翻译文才对此有了较深的理解 特此copy 望见谅 目录 故事案例 table简介 Q learning 算法 学习动作值函数 action
  • MATLAB中生成随机数方法总结

    好久没用MATLAB了 今天在利用MATLAB进行数据处理时 突然发现自己忘记了该如何产生自己需要的随机数形式 于是又查了一通资料 现对其进行一个简单的总结 供自己和大家以后参考 1 randi 产生均匀分布的伪随机整数 产生一个1至10之
  • linux下查询缺少的依赖文件归属于哪个rpm包

    我们在redhat下使用rpm ivh安装rpm包的时候 经常会报缺少依赖条件的错误 如下 root abc Packages rpm ivh httpd 2 4 6 17 el7 x8664 rpm 错误 依赖检测失败 etc mime
  • 浏览器的跨域问题

    什么导致的浏览器的跨域问题 不同源的ajax请求会导致出现跨域的错误 必须要是ajax请求 并且是不同源的才会出现跨域问题 跨域主要是出现在浏览器阻止了响应的接收 服务器有接收到请求也有发出响应 这里是浏览器存在同源策略 什么是同源 同源是
  • 视频剪辑利器:全能的音视频处理工具

    本次推荐的四个开源项目共同展现了开放 灵活和高效的多媒体处理能力 你可以使用它们进行剪辑 格式转换 添加音频轨道或字幕 甚至通过自动生成字幕来裁剪视频 无论是优化媒体文件 节省存储空间还是创造出令人惊叹的视觉效果 这些项目都将成为你不可或缺
  • (转)知乎-区块链技术:如何赋能供应链创新

    区块链技术 如何赋能供应链创新 佳晨说 可能很多人对区块链技术有一定的了解 这份了解大多数都是来自于比特币这样的一个概念 区块链的本质到底是什么 为什么又能够为供应链创新提供新的动力 因为区块链技术可以在供应链的物流 信息流 资金流和业务流
  • Android 11.0 无源码apk设置默认启动Launcher的相关属性

    目录 1 概述 2 无源码apk设置默认启动Launcher的相关属性的核心类
  • vue中使用vditor(发布,编辑,详情回显、上传图片+粘贴图片回显问题,表情的处理)

    文章目录 1 使用方法 1 html 2 dom 发布和编辑页面 3 详情页面 1 页面 2 引入 3 dom 效果图 补充遗漏的XSS过滤 1 注入脚本 2 过滤方法 3 在input val 中调用 补充防盗链功能 此方法有视觉变化 3
  • 获取和设置tinyMCE 4编辑器的内容

    对于tinymce编辑器是无法通过js进行内容的读写的 必须使用编辑器自身的方法才行 下面是一些方法 希望能对用到的朋友有所帮助 1 如果当前页面只有一个编辑器 获取内容 tinyMCE activeEditor getContent 设置
  • STL中set的基本介绍

    STl中的基本内容 容器 set multiset 在集合中 所有的元素只能出现一次 并且默认按照元素的值从小到大自动排序 set不能通过迭代器来修改元素的值 即set的迭代器是一种const iterator multiset 和 set