C++ STL set:erase()、clear()、find()、insert()方法

2023-11-05

一、erase() 方法

        如图所示:

#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
    //创建并初始化 set 容器
    set<int>myset{1,2,3,4,5};
    cout << "myset size = " << myset.size() << endl;

    //1) 调用第一种格式的 erase() 方法, 其返回值为一个整数,表示成功删除的元素个数
    int num = myset.erase(2); //删除元素 2,myset={1,3,4,5}
    cout << "1、myset size = " << myset.size() << endl;
    cout << "num = " << num << endl;

    //2) 调用第二种格式的 erase() 方法, 返回值是迭代器,其指向的是 set 容器中删除元素之后的第一个元素
    set<int>::iterator iter = myset.erase(myset.begin()); //删除元素 1,myset={3,4,5}
    cout << "2、myset size = " << myset.size() << endl;
    cout << "iter->" << *iter << endl;

    //3) 调用第三种格式的 erase() 方法, 返回值是迭代器,其指向的是 set 容器中删除元素之后的第一个元素
    set<int>::iterator iter2 = myset.erase(myset.begin(), --myset.end());//删除元素 3,4,myset={5}
    cout << "3、myset size = " << myset.size() << endl;
    cout << "iter2->" << *iter2 << endl;
    return 0;
}

        执行结果为:

二、clear()方法

        该方法不需要传入任何参数,也没有任何返回值。

#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
    //创建并初始化 set 容器
    std::set<int>myset{1,2,3,4,5};
    cout << "1、myset size = " << myset.size() << endl;
    //清空 myset 容器
    myset.clear();
    cout << "2、myset size = " << myset.size() << endl;
    return 0;
}

        执行结果为:

三、find()方法

参数:该函数接受一个强制性参数element ,该元素指定要在集合容器中搜索的元素。

返回值:该函数返回一个迭代器,该迭代器指向在集合容器中搜索的元素。如果找不到该元素,则迭代器将指向集合中最后一个元素之后的位置。

// CPP program to demonstrate the
// set::find() function
#include <bits/stdc++.h>
using namespace std;
int main()
{

    // Initialize set
    set<int> s;

    s.insert(1);
    s.insert(4);
    s.insert(2);
    s.insert(5);
    s.insert(3);
    for (auto j = s.begin(); j != s.end(); j++) {
        cout << *j<<"\t";
    }
    cout<<endl;
    auto pos = s.find(3);
    // prints the set elements
    cout << "The set elements after 3 are: ";
    for (auto it = pos; it != s.end(); it++)
        cout << *it << " ";

    return 0;
}

         这些都是查找成功的情况,返回对应元素位置的迭代器,那如果找不到呢?经过验证得出:找不到返回it.end(),也即集合中最后一个元素之后的位置。但我试了发现一个很奇怪的事:找不到时返回的迭代器对应的元素居然不是0,而是5(集合中最后一个元素)!如图所示:

#include <bits/stdc++.h>
using namespace std;
int main()
{

    // Initialize set
    set<int> s;

    s.insert(1);
    s.insert(4);
    s.insert(2);
    s.insert(5);
    s.insert(3);
    for (auto j = s.begin(); j != s.end(); j++) {
        cout << *j<<"\t";
    }
    cout<<endl;

    cout<<"找不存在的0:";
    auto pos = s.find(0);
    cout<<*pos<<"\t";
    cout<<(pos==s.end())<<endl;

    cout<<"找存在的5:";
    auto pos2 = s.find(5);
    cout<<*pos2<<"\t";
    cout<<(pos2==s.end())<<endl;

    cout<<"找不存在的6:";
    auto pos3 = s.find(6);
    cout<<*pos3<<"\t";
    cout<<(pos3==s.end())<<endl;

    cout<<"找不存在的7:";
    auto pos4 = s.find(7);
    cout<<*pos4<<"\t";
    cout<<(pos4==s.end())<<endl;

    cout<<"*s.begin():"<<*s.begin()<<endl;
    cout<<"*s.end():"<<*s.end()<<endl;
    return 0;
}

        可见s.end()虽然指向不存在的位置,但这个位置的数据并不是0,而是非空集合当中的最后一个元素!

        所以判断是否成功找到的条件应该为if(pos!=s.end())而不是if(*pos!=0):

	set<int> test;
	if(test.find(x)!=test.end());	//之前忘记加()
	{
	···
	}

四、insert()方法

#include <bits/stdc++.h> 
using namespace std; 
int main() 
{ 
  
    set<int> s; 
  
    // Function to insert elements 
    // in the set container 
    s.insert(1); 
    s.insert(4); 
    s.insert(2); 
    s.insert(5); 
    s.insert(3); 
  
    cout << "The elements in set are: "; 
    for (auto it = s.begin(); it != s.end(); it++) 
        cout << *it << " "; 
  
    return 0; 
}

 

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

C++ STL set:erase()、clear()、find()、insert()方法 的相关文章

  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 如何在c#中创建多线程

    我需要监听机器中的所有串行端口 假设我的机器有 4 个串行端口 我必须创建 4 个线程并开始分别使用附加线程监听每个端口 我使用此代码来获取我的机器中的端口数量 private SerialPort comPort new SerialPo
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new

随机推荐

  • 弗洛伊德算法(floyd)

    弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题 弗洛伊德算法使用了动态规划的思想 用二维矩阵记录了所有点之间最短的距离 虽然代码只有几行 但是思想还很值得回味的 其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短 公式 v
  • 看过来——用Python探索《红楼梦》的人物关系

    数据准备 红楼梦 txt 文件一份 金陵十二钗 贾宝玉 人物名称列表 宝玉 nr 黛玉 nr 宝钗 nr 湘云 nr 凤姐 nr 李纨 nr 元春 nr 迎春 nr 探春 nr 惜春 nr 妙玉 nr 巧姐 nr 秦氏 nr 该分列表是为了
  • SpringBoot Admin服务离线、不显示健康信息的问题

    SpringBoot Admin服务离线 不显示健康信息的问题 问题1 SpringBoot Admin服务一直离线 原因 解决方法 重启电脑 重新加载配置文件 问题2 数据显示不全 解决方法 问题1 SpringBoot Admin服务一
  • 进程篇----获取进程句柄(提权、打开)OpenProcess

    对目标进程提权 然后打开 提权的目的是为了防止当前进程的权限无法打开目标进程 获取句柄 BOOL EnableDebugPrivilege TRUE 代表需要提权 BOOL EnableDebugPrivilege FALSE 代表不需提权
  • Python:统计子矩阵(前缀和、尺取法)

    问题描述 给定一个 N M 的矩阵 A 请你统计有多少个子矩阵 最小 1 1 最大 N M 满足子矩阵中所有数的和不超过给定的整数 K 输入格式 第一行包含三个整数 N M 和 K 之后 N 行每行包含 M 个整数 代表矩阵 A 输出格式
  • arduino python scratch_arduino怎么和scratch用

    展开全部 arduino可以和scratch在一起使用62616964757a686964616fe58685e5aeb931333433633365 但环节比较复杂 每个环节都需要注意 具体方法如下 1 由于scratch软件和ardui
  • SpringBoot Bean指定初始化顺序详解

    最近遇到SpringBoot容器外类初始化依赖容器内bean的问题 由于容器内bean初始化有一定顺序 网上查了查资料 这里记录一下 0 前言 本文将介绍几种可行的方式来控制 bean 之间的加载顺序 Order指明顺序 AutoConfi
  • 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...

    操作系统有哪几大特征 其最基本的特征是什么 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 操作系统有哪几大特征 其最基本的特征是什么 操作系统的基本特征 1 并
  • Java串口包Javax.comm的安装

    安装个java的串口包安装了半天 一直找不到串口 现在终于搞定了 做个记录 因为是windows下开发 去下载 http mdubuc freeshell org Jolt javacomm20 win32 zip 完整的2 0版本 还有e
  • visual studio 2008 试用版评估期已结束的解决方法

    在 控制面板 中启动 添加删除程序 选中Vs2008 点击 更改 删除 输入序列号 PYHYP WXB3B B2CCM V9DX9 VDY8T
  • 深入ZooKeeper——ZooKeeper原语和架构

    ZooKeeper基础 设计一个用于协作需求的服务的方法往往是 提供原语列表 暴露出每个原语的实例化调用方法 并直接控制这些实例 这种设计存在一些重大的缺陷 首先 我们要么预先提出一份详尽的原语列表 要么提供API的扩展 以便引入新的原语
  • 输出斐波那契数列前n项以及前n项和

    首先介绍一下斐波那契数列 1 1 2 3 5 8 13 21 34 55 在数学上 斐波那契数列以递推的方法定义 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 代码的实现 斐波那契数列 int fibonacci
  • Koa笔记 01:基础入门

    文章目录 目的 基础介绍 Koa Context Request Response 错误处理 总结 目的 Node js最基本的是用来搭建HTTP服务器使用 它内置的模块基本上可以满足基础的HTTP服务器功能 但是如果要实现比较完整的HTT
  • pinyin4j 常见用法

    1 简单介绍 有时候 需要将汉字编程对应的拼音 以方便数据的处理 比如在Android手机应用的开发上 要查询联系人的姓名 通常都是用拼音进行查询的 比如要查询 曹孟德 就可以输入 cmd 即 曹孟德 三个汉字的拼音 caomengde 各
  • 两种方式修改jar内配置文件(1 解压jar,修改并重新打包;2 直接修改jar内指定配置文件)

    参考 修改jar包中的配置文件 木头房子的的博客 CSDN博客 一 jar工具直接修改包内文件 1 列出jar包中的所有目录及目录下文件 找到需要修改的文件并复制路径 如果知道文件具体位置 则跳过此步 列出jar下所有目录及目录下文件 ja
  • 什么是预热 压测_换个角度,聊聊全链路压测

    前言 之前自己也写过好几篇关于全链路压测的文章或者博客 最近看了infoQ上infoQ 数列科技杨德华的专栏 复盘了下自己以往在全链路压测实施方面的工作 发觉还有很多可以做的更好的地方 就以这篇文章来做个总结 顺带说说我自己实施全链路压测工
  • python+word+excel+ppt自动化办公教程_python自动化办公——excel操作

    1 打开工作表 excel表操作 from openpyxl import load workbook workbook load workbook 11 xlsx print workbook sheetnames excel表操作 fr
  • C#学习笔记一:C#开发环境的设置

    C 是 NET Framework的一部分 用于编写 NET应用程序 C 集成开发环境 IDE 微软提供了以下C 编程开发工具 Visual Studio 2010 VS Visual C 2010 Express VCE Visual W
  • 数字化的终局:赛博朋克?社会主义?

    数字化的终局 赛博朋克 社会主义 数字化的浪潮席卷而来 无论我们愿不愿意 都已经事实上被裹挟 在这场风暴中人类活动的数据被搜集 分析 然后反过来影响人类的行为 就如同 外卖骑手 困在系统里 中所描述的那样 外卖 是如此经典的一个场景 能让我
  • C++ STL set:erase()、clear()、find()、insert()方法

    一 erase 方法 如图所示 include