【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容器 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 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