C++ set容器使用方法

2023-11-07

set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。在set中,每个元素都是唯一的,如果想要允许重复元素,可以使用multiset。

1.set的常用操作

使用时注意包含头文件<set>    std::set and std::multiset associative containers

s.begin()      返回set容器的第一个元素

s.end()      返回set容器的最后一个元素

s.clear()       删除set容器中的所有的元素

s.empty()     判断set容器是否为空

s.insert()      插入一个元素

s.erase()       删除一个元素

s.size()     返回当前set容器中的元素个数

2.set容器的创建

#include <iostream>
#include <set>
#include <vector>
using namespace std;
int main(){
	set<int> myset;
	int a[5] = { 1, 2, 3, 4, 5 };
	vector<int> vec{ 1, 2, 3, 4, 5 };
	set<int> myset1(a, a+5);//根据数组地址初始化
	set<int> myset2(vec.begin(), vec.end());//vector地址初始化
	set<int> myset3(myset2.begin(), myset2.end());//set初始化
	set<int> myset4(myset3); //复制初始化
	system("pause");
	return 0;
}

3.增删改查
插入

#include <iostream>
#include <set>
#include <vector>

using namespace std;

set<int> myset;
void printSet(int count){
	cout << "Test output" << count << ":" << endl;
	for (set<int>::iterator it = myset.begin(); it != myset.end(); it++){
		cout << *it << " ";
	}
	cout << endl;
}
int main(){
	int count = 1;
	myset.insert(1);
	myset.insert(2);
	myset.insert(3);
	printSet(count);

	myset.insert(2); //不允许重复值出现
	printSet(++count);

	int a[4]={11, 12, 13, 14};
	myset.insert(a, a + 4);
	printSet(++count);
	system("pause");
	return 0;
}

在这里插入图片描述

删除

s.erase()     清除某个元素
s.clear()     清除所有元素
#include <iostream>
#include <set>
#include <vector>

using namespace std;

set<int> myset;
void printSet(int count){
	cout << "Test output" << count << ":" << endl;
	for (set<int>::iterator it = myset.begin(); it != myset.end(); it++){
		cout << *it << " ";
	}
	cout << endl;
}
int main(){
	int count = 1;
	for (int i = 1; i < 11; i++){
		myset.insert(i);
	}
	printSet(count);
	myset.erase(8);
	printSet(++count);

	set<int>::iterator ita = myset.begin();
	set<int>::iterator itb = myset.end();
	myset.erase(ita);//根据迭代器位置删除元素
	printSet(++count);
	
	ita = myset.begin();
	itb = myset.begin();
	itb++; itb++;
	myset.erase(ita, itb); //删除区间[ita,itb)的元素
	printSet(++count);

	myset.clear();

	system("pause");
	return 0;
}


在这里插入图片描述
修改
不能直接修改,需要删除后再次添加。

查找

s.find()        查找一个元素,如果容器中不存在该元素,返回值等于s.end()
#include <iostream>
#include <set>
#include <vector>

using namespace std;

set<int> myset;
void printSet(int count){
	cout << "Test output" << count << ":" << endl;
	for (set<int>::iterator it = myset.begin(); it != myset.end(); it++){
		cout << *it << " ";
	}
	cout << endl;
}
int main(){
	int count = 1;
	for (int i = 1; i < 11; i++){
		myset.insert(i);
	}

	if (myset.find(2) != myset.end())
		cout << "2 is in the set" << endl;
	else
		cout << "2 is not in the set" << endl;

	if (myset.find(20) == myset.end())
		cout << "20 is not in the set" << endl;
	else
		cout << "20 is in the set" << endl;

	myset.clear();

	system("pause");
	return 0;
}


在这里插入图片描述
4.其它操作

s.lower_bound() 返回第一个大于或等于给定关键值的元素

s.upper_bound() 返回第一个大于给定关键值的元素

s.equal_range() 返回一对定位器,分别表示 第一个大于或等于给定关键值的元素 和 第一个大于给定关键值
                的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于
                s.end()

#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main(){
	int count = 1;
	for (int i = 1; i < 11; i++){
		myset.insert(i);
	}

	cout << "lower_bound & upper_bound test:" << endl;
	cout << "第一个大于等于3的元素:" << *myset.lower_bound(3) << endl; //函数实际返回地址值
	cout << "第一个大于3的元素:" << *myset.upper_bound(3) << endl;
	
	cout << "equal_range test:" << endl;
	cout << "第一个大于或等于2的元素: " << *myset.equal_range(2).first << endl;
	cout << "第一个大于2的元素: " << *myset.equal_range(2).second << endl;
	if (myset.equal_range(20).first == myset.end())
		cout << "不存在大于等于20的元素" << endl;

	myset.clear();

	system("pause");
	return 0;
}


在这里插入图片描述
判断为空 & 元素是否在set中

#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main(){
	int count = 1;
	for (int i = 1; i < 11; i++){
		myset.insert(i);
	}

	if (!myset.empty())
		cout << "set is not empty" << endl;

	if (myset.count(3))
		cout << "3 is in the set" << endl;

	myset.clear();

	system("pause");
	return 0;
}


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

C++ set容器使用方法 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 重载<<的返回值

    include
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)

    线性变换 假设输入图像为I 宽为W 高为H 输出图像为O 图像的线性变换可以用以下公式定义 O r c
  • vscode修改背景

    1 在扩展中输入background 并安装 2 按住 Ctrl 打开设置页面 输入background 在扩展设置中点击 在settings json中编辑 3 在大括号中 输入下列代码来设置背景图的样式 透明度可根据自己的需求修改 代码
  • 计算机网络传输层(上)

    计算机网络传输层 上 传输层概述 1 传输层协议为运行在不同host上的进程提供了一种逻辑通信机制 2 端系统运行传输层协议 发送方 将应用递交的消息分成一个或多个的segment 并向下穿给网络层 接受方 将接受到的segment组装成消
  • Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8

    问题描述 把Gradle插件版本更新到7 0 2之后编译失败 出现如下错误 A problem occurred evaluating project app gt Failed to apply plugin com android in
  • 基于vue2开发的毕业设计(时光云平台)

    自己经过一段时间的琢磨和设计 该平台已经完成了基本的功能需求 大家可以来一起看一下 或许对你的设计有所帮助 视频详解 基于vue2开发的毕业设计 时光云平台 访问连接 点击进入 前端的登录首页界面 前台注册页面展示界面 登录进去的首页界面展
  • java访问其他机器上的mysql_java实现从一台机器访问另外一台机器的mysql数据库

    烙印99 驱动程序名 String driver com mysql jdbc Driver URL指向要访问的数据库名scutcs String url jdbc mysql 另一台电脑的ip地址 3306 数据库名 MySQL配置时的用
  • Java 内部是如何判断Map中的两个键是否一样

    Java 内部是如何判断Map中的两个键是否一样 为什么会问这个问题呢 源于我在慕课网看到相关的教学视频 http www imooc com video 5987 中有出现这个判断方法 是关于重写hashcode 和equals 方法 但
  • [TFF学习]官方教程jupyter运行记录_联邦学习之图像分类任务_1

    chapter 1 检查系统环境和第三方库是否安装完毕 在Web服务器 gui应用程序和jupyter笔记本运行python程序时 出现 RuntimeError This event loop is already running 可能是
  • python“ModuleNotFoundError: No module named 模块名” 错误的一种情况

    跨目录导包 运行python脚本时 有时出现如题的错误 原因一般是用了os sys两个模块 而没有理解清楚两者的关系 os是关于本地系统的操作 sys是关于python环境的操作 如模块搜索路径配置 一种情况如下 import sys os
  • 又回老家了

    不愿意在朝阳区当天选打工人了 于是回老家了 找了份点云渲染的工作 月薪两万五 下月入职 本打算从小公司起步 做ue 没想到 现有的两套框架和十几个成熟项目不让碰 大概是提防着我吧 只让攻坚克难 做cesium for ue和热更新 想想也没
  • UE4.25 Slate源码解读

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • echarts中的legend属性

    legend orient vertical right 0 top 15 icon circle 小圆点 itemWidth 8 itemHeight 8 itemGap 15 间隔 formatter function params l
  • 潜在结果框架(Potential outcomes)与工具变量(Instrumental variable)介绍

    Potential outcomes framework 什么是potential outcome呢 考虑在医学中 X 0表示不吃药 X 1表示吃药 那么很显然 一个人是没有办法同时吃药与不吃药的 所以我们只能够观测到其中的一个结果 即 Y
  • Javaweb学生信息管理系统(Mysql+JSP+MVC+CSS)

    目录 一 项目介绍 二 运行效果 1 登录界面 2 主界面 点击学号修改学生信息 3 增加学生界面 编辑 三 项目目录结构 四 代码展示 1 jsp及css代码 登录界面代码 login jsp 登录界面css login css 注册用户
  • js深拷贝

    js深拷贝的几种方式 概念介绍 深拷贝 在堆内存中重新开辟一个存储空间 完全克隆一个一模一样的对象 浅拷贝 不在堆内存中重新开辟空间 只复制栈内存中的引用地址 本质上两个对象 数组 依然指向同一块存储空间 一 递归方式 推荐 项目中最安全最
  • 4款超实用绘图软件

    对于新手来说 很多人认为绘图软件需要一定基础的设计功底 但其实也不完全是 在网上有很多非常实用的绘图软件可以迅速的帮助我们解决工作中的绘图问题 以下4款是这两年我的小伙伴们用的最多的 推荐给大家 亿图图示 亿图图示是我用的比较多的一个绘图软
  • windows的磁盘操作之九——区分本地磁盘与移动硬盘

    转载自 windows的磁盘操作之九 区分本地磁盘与移动硬盘 bunny技术坊的技术博客 51CTO博客 原文如下 最近碰到了个新问题 记录下来作为windows的磁盘操作那个系列的续篇吧 一些时候我们的程序需要区分本地存储设备和USB存储
  • JAVA毕设可能遇到的问题,老程序员来告诉你

    在进行JAVA毕设时 有一些常见问题需要考虑和解决 以下是几个可能遇到的问题和建议的解决方案 缺乏清晰的项目目标 在开始JAVA毕设之前 需要明确项目的目标和范围 如果没有清晰的目标 可能会导致项目无法顺利进行 或者最终无法达到预期的结果
  • 正大期货交易时间

    交易所及时间 上海期货交易所 上午是9点到10点15 以及10点半到11点半 下午是13点半到14点10 以及14点20到15点 夜盘是21点到次日凌晨的2点半 大连 郑州商品交易所 上午是9点到10点15 以及10点半到11点半 下午是1
  • C++ set容器使用方法

    set是STL中一种标准关联容器 它底层使用平衡的搜索树 红黑树实现 插入删除操作时仅仅需要指针操作节点即可完成 不涉及到内存移动和拷贝 所以效率比较高 在set中 每个元素都是唯一的 如果想要允许重复元素 可以使用multiset 1 s