【C++】STL库set容器

2023-11-12


  1. Set的定义:set s1 = {1,6,-3}; // 内部自动递增排序

set < T > name;
set< int> name;
set< double> name;
set< char> name;
set< Node> name;//Node是结构体类型
(1)定义和写法和vector基本一样,同样typename可以是任何基本类型,结构体,STL容器类型。
(2)同样,typename是容器的时候,>>后要加空格,避免编译器当成位运算出错。

  1. Set:集合,一个内部自动有序而且不重复元素的容器
  2. set内的元素,自动递增排序,并且去重。
  3. set只能通过迭代器iterator访问
  4. 定义和写法和vector基本一样,<数据类型>以是任何基本类型;
  5. iterator 不支持 “+”运算符重载,但支持++、- -;

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

1、构造函数

  1. set < T > s; // 创建空集合
  2. set < T > s1=s; // 拷贝构造函数
    set < T > s1(s);
#include "stdafx.h"
#include <iostream>
#include <set>
using namespace std;

int main() {
	//------------------ set 的定义
	set <int> s1 = {1,6,-3}; // 内部自动递增排序
	for (auto it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " "; // -3 1 6
	}


	//------------------ set() 构造函数
	set <char> s2;
	cout << s2.size() << endl; // 0

	
	//------------------  拷贝构造函数
	set <char> s3;
	s3.insert('a');
	s3.insert('b');
	s3.insert('1');
	s3.insert('@');

	set<char> s4(s3); // set<char> s4=s3;
	for (auto it = s4.begin(); it != s4.end(); ++it) {
		cout << *it << " "; // 1 @ a b
	}


	return 0;
}

2、增

2.1 insert() 去重+排序

insert(x):将x插入set容器中,并且自动递增排序和去重。时间复杂度为O(logN),N为元素个数。

2.2 emplace() 去重+排序

emplace(x):将x插入set容器中,并且自动递增排序和去重。

2.3 代码演示

int main() {
	//------------------ insert( ) 插入——去重+排序
	set <char> s1;
	s1.insert('a');
	s1.insert('a');
	s1.insert('b');
	s1.insert('1');
	s1.insert('a');
	s1.insert('@');
	s1.insert('a');
	for (auto it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " "; // 1 @ a b
	}


	//------------------ emplace()  去重 + 排序
	set <int> s2;
	s2.emplace(99);
	s2.emplace(1);
	s2.emplace(0);
	s2.emplace(-5);
	s2.emplace(0);
	s2.emplace(33);
	s2.emplace(0);
	s2.emplace(25);
	s2.emplace(0);
	for (auto it = s2.begin(); it != s2.end(); ++it) {
		cout << *it << " "; // -5 0 1 25 33 99
	}

	return 0;
}

3、删

3.1 erase()函数

  1. erase(x):删除单个元素,时间复杂度为O(logN)。返回值是 void,调用 erase 之后,当前迭代器会失效,无法再用于获取下一个迭代器。因此需要 erase 之前就获取指向下一个元素的迭代器
  2. erase(a,b);删除左闭右开区间内[a,b)的元素,时间复杂度为O(b-a)。返回值是返回值是指向删除元素下一个元素的迭代器

3.1.1 erase() ——list与vector

set只能通过迭代器iterator访问;
list与vector中的erase用法相同,它们的 erase 函数会返回指向下一个元素的迭代器,因此在遍历时,只需要 it = c.erase(it); 即可。

vector<int>::iterator it = vec.begin();  
for (; it != vec.end();)  
{  
    if (*it == 10) {  
        it = vec.erase(it);  
    }  
    else {  
        ++it;  
    }  
} 

3.1.2 erase() ——map与set

map与set中的erase用法相同,它们的 erase 函数返回值是 void,调用 erase 之后,当前迭代器会失效,无法再用于获取下一个迭代器因此需要 erase 之前就获取指向下一个元素的迭代器

map<int, int>::iterator it = m.begin();  
for (; it != m.end();)  
{  
    if (it->fist == 10) {  
        m.erase(it++);  
    }  
    else {  
        ++it;  
    }  
}

3.2 clear()函数

clear():用来清空set所有元素,时间复杂度为O(N)

3.3 代码演示

#include "stdafx.h"
#include <iostream>
#include <set>
using namespace std;

int main() {
	//------------------ erase(x) ( ) 删除x
	set <char> s1;
	s1.insert('a');
	s1.insert('a');
	s1.insert('b');
	s1.insert('1');
	s1.insert('a');
	s1.insert('@');
	s1.insert('d');
	s1.insert('3');
	s1.insert('f');
	s1.insert('-');

	for (auto it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " "; // - 1 3 @ a b d f
	}

	int next = s1.erase('@'); 
	cout << "next="<< next << endl; // next=1

	for (auto it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " "; //  - 1 3 a b d f
	}



	//------------------ erase(first,last) ( ) 删除x
	set<int> s2 = {1,2,3,4,5,6};
	auto it = ++s2.begin();
	auto it1 = --s2.end();
	auto itorReturn = s2.erase(it, it1);
	cout << "itorReturn=" << *itorReturn << endl; // itorReturn=6 返回值是指向删除元素下一个元素的迭代器
	for (auto it2 = s2.begin(); it2 != s2.end(); ++it2) {
		cout << *it2 << " "; // 1 6

	return 0;
}

4、改

4.1 swap()交换

#include "stdafx.h"
#include <iostream>
#include <set>
using namespace std;

int main() {
	//------------------ swap( ) 交换
	set <char> s1;
	s1.insert('a');
	s1.insert('a');
	s1.insert('b');
	s1.insert('1');
	s1.insert('a');

	set<char> s2;
	s2.insert('@');
	s2.insert('d');
	s2.insert('3');
	s2.insert('f');
	s2.insert('-');

	s2.swap(s1);

	for (auto it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " "; // - 3 @ d f
	}

	for (auto it = s2.begin(); it != s2.end(); ++it) {
		cout << *it << " "; //  1 a b
	}

	return 0;
}

5、查

5.1 for循环+迭代器 (遍历)

set只能通过迭代器iterator访问,因为除了vector和string之外的STL的容器都不支持以下标的方式访问。

5.2 find()函数

find(value):查找值为value的元素,返回它的迭代器。时间复杂度为O(logN),N为元素个数。

int main() {
	//------------------ 1. 迭代器遍历
	set <char> s1;
	s1.insert('a');
	s1.insert('a');
	s1.insert('b');
	s1.insert('1');
	s1.insert('a');
	s1.insert('@');
	s1.insert('d');
	s1.insert('3');
	s1.insert('f');
	s1.insert('-');

	for (auto it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " "; // - 1 3 @ a b d f
	}


	//------------------ 2. find (val ) 查找val的迭代器
	set<int> s2 = {1,2,2,2,2,3,4,5,6,2};
	auto it = s2.find(2);
	cout << "val的迭代器指向的元素值是:"<< *it << endl; //  val的迭代器指向的元素值是:2
	
	return 0;
}

6、大小

6.1 size()函数

用来获得set内元素的个数,时间复杂度为O(1)

6.2 count(val)查个数

返回元素在集合中出现的次数(去重后的结果)

6.3 max_size() 最大容量

代码演示

int main() {
	set <char> s1;
	s1.insert('a');
	s1.insert('a');
	s1.insert('b');
	s1.insert('1');
	s1.insert('a');
	s1.insert('@');
	s1.insert('d');
	s1.insert('3');
	s1.insert('f');
	s1.insert('-');


	cout << "size=" << s1.size() << endl; // size=8
	cout << "max_size=" << s1.max_size()<<endl; // max_size=268435455
	cout << "count=" << s1.count('a') << endl; // count=1
	cout << "count=" << s1.count('@') << endl; // count=1
	cout << "count=" << s1.count('!') << endl; // count=0

	return 0;
}

7、empty()判空

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

【C++】STL库set容器 的相关文章

  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 当我单击 GridView 项时返回 ImageView 实例

    当我点击GridView项时如何返回ImageView实例 我为 ItemClick 创建自定义绑定事件 public class ItemClickSquareBinding MvxBaseAndroidTargetBinding pri
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 为什么以下代码不允许我使用 fgets 获取用户输入但可以使用 scanf?

    这是一个更大程序的简短摘录 但该程序的其余部分无关紧要 因为我认为我能够隔离该问题 我怀疑这与我使用 fgets 的方式有关 我读过 最好使用 fgets 而不是 scanf 但我似乎无法让它在这里正常工作 当我使用以下代码时 程序不会给我
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 使用 AutoMapper 进行 LINQ GroupBy 聚合

    试图让查询工作 但老实说不确定如何 或者是否可能 进行它 因为我尝试过的一切都不起作用 共查询6个表 Person PersonVote PersonCategory Category City FirstAdminDivision Per
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有

随机推荐

  • iOS集成Bugly详解

    异常上报 SDK 集成 通过CocoaPods集成 新建项目 cd 项目目录 vim Podfile source https github com CocoaPods Specs git inhibit all warnings plat
  • 服务器运维管理

    运维人员在日常维护服务器方面避免不了对服务器进行批量管理操作 那站长人群一般都用什么工具管理服务器呢 以下是个人用的对于服务器管理比较便捷的软件 该软件产地 中国 软件名称 IIS7远程桌面 可自行百度查询 系统 目前支持win所有系统 特
  • Java程序员的专属社区

    一个人走的快 一群人走的远 这是Java程序员专属社区创立的初衷 Java程序员大本营 是面向工作1 3年 希望提升专业技术能力的Java 开发者建立 致力于Java知识的分享 交流与学习 点击关注 Java程序员大本营 我们希望通过CSD
  • 程序猿的三高:高并发、高可用、高性能

    一 高并发指标 高并发是现在互联网分布式框架设计必须要考虑的因素之一 它是可以保证系统能被同时并行处理很多请求 对于高并发来说 它的指标有 响应时间 系统对进来的请求反应的时间 比如你打开一个页面需要1秒 那么这1秒就是响应时间 吞吐量 吞
  • 苹果ipa包发布在IIS环境记录

    项目以前IOS打包都是发布到了蒲公英上 不过最近蒲公英突然升级 之前的发布记录全都没了不说 再次上传居然没有公开选项了 也就是说用户每次下载安装都需要输入一个预设密码 最奇葩的是你连接中包含了密码也没用 打开连接时没密码 点安装却提示你要输
  • Linux内存管理(7) - page fault

    了解linux page fault 1 概述 A page fault sometimes called PF PF or hard fault a is a type of exception raised by computer ha
  • Hyperf数据库批量更新

    Hyperf没有批量更新的功能 网上的支持也比较少 但Hyperf是基于laravel的orm 因此可以搜下大神们写的laravel的批量更新的方法 批量更新 public function updateBatch multipleData
  • C语言:定时器原理

    首先 要知道 C语言的定时器是对运行结果起到延时作用 其中 定时单位位毫秒 定时器 顾名思义 肯定会用到时间的 所以 获取时间我们就要用到time库 所以要引用头文件
  • 使用js实现网页录音并上传服务器

    不多嘚嘚 直接上代码
  • Unity界面插件NGUI核心组件说明

    UICamera 可以添加到任何相机 包含事件系统 UICamera是每个UI的重要组成部分 它负责发送Camera中所有NGUI的活动 如果场景中仅有一个Camera 要确保它附有UICamera脚本 如果有多个相机 确保至少用来渲染UI
  • Elasticsearch 7 插件

    1 elasticsearch head 可视化插件 通过浏览器就能看到es的集群部署 节点 索引等信息 注意 es在5 x版本就不再支持head插件安装了 百度搜索可以有多种方式安装 我这里用的是谷歌浏览器安装es head的扩展程序 如
  • 读《携程异步消息系统实践》之总结

    读 携程异步消息系统实践 之总结 消息系统 批量 insertOnly 索引 消息投递 Partition Stick 写入事件截获 预期 Long polling 集群管理 Lease
  • Markdown 有序列表、无序列表中插入代码块

    问题描述 在列表中插入代码块 代码块总是顶格的 并且导致代码块之后的文本也是顶格的 也就是代码块的插入导致了列表的结束 如下所示 解决方法 代码块上方空出来一行 代码块左侧加8个空格或2个TAB 每一行都加 预期效果 扩展 本人个人网站上采
  • 基于Qt仿QQ效果实现图片查看器(支持查看GIF)

    主要提供两个类 第一个类显示静态图片 第二个类显示动态图片 两个类都包含图片缩小放大以及图片移动功能 最后自己封装一个类 根据判断图片是动态还是静态去调用对应的类显示图片 效果展示 判断图片类型 int showImage getImage
  • Mac系统安装Myeclipse2015CI出现虚拟内存为0的问题

    出处 http bbs feng com read htm tid 8450072 page 2 html 方法1 你可以按照9楼的朋友的方法 开启虚拟机的情况下 再安装Myeclipse 就不会出现虚拟内存为0的提示 方法2 Downlo
  • 一元二元三元表达式_2020年高考复习不等式专题训练2.三元不等式的证明

    三元不等式是二元不等式的补充形式 三元不等式和二元不等式类似 经常会有一个三元等式作为条件 解决三元不等式问题的思路大致分为两种 第一是根据等式条件减少未知量的数量 将三元转化为二元 第二是直接利用二元基本不等式的扩展形式或者将三元两两组合
  • Qt中click事件如何响应带参槽函数

    include qttest008 h include
  • Android LCD(一):LCD基本原理篇

    关键词 android LCD TFT 液晶 偏光片 彩色滤光片 背光 平台信息 内核 linux2 6 linux3 0系统 android android4 0 平台 samsung exynos 4210 exynos 4412 ex
  • PHP分页页面重复,WordPress分页标题重复如何解决

    WordPress是一款非常流行的博客程序 虽然它各方面的优化都做的不错了 但每个人的喜好都不一样 一些细节还是可以改进的 No牛网就碰到Wordpress很多的问题都不是那么好实现 毕竟不是专门做CMS的 如等下要说到的Wordpress
  • 【C++】STL库set容器

    STL库set容器 1 构造函数 2 增 2 1 insert 去重 排序 2 2 emplace 去重 排序 2 3 代码演示 3 删 3 1 erase 函数 3 1 1 erase list与vector 3 1 2 erase ma