一、set 的介绍

set 翻译为集合,是一个内部自动有序不含重复元素的容器。

当出现需要去掉重复元素的情况,而且有可能因这些元素比较大或者类型不是 int 型而不能直接开散列表,在这种情况下就可以用 set 来保留元素本身而不考虑它的个数。

当然,上面说的情况也可以通过再开一个数组进行下标和元素的对应来解决,但是 set 提供了更为直观的接口,并且加入 set 之后可以实现自动排序。

二、set 的定义

单独定义一个 set:

set<typename> name; 
//这里的typename可以是任何基本类型,例如 int、double、char、结构体等,也可以是STL标准容器,例如vector、set、queue等。

eg:
set<int> name;
set<double> name;
set<char> name;
set<node> name; //node是结构体的类型
set<vector<int> > name; //如果typename 是一个STL容器,那么定义时要记得在 >>之间要加空格

定义 set 数组:

set<typename> Arrayname[arraySize];

这样 Arrayname[0] ~ Arrayname[arraySize -1] 中每一个都是一个 set 容器。

eg:
set<int> vi[100];

三、set 容器内元素的访问

set 只能通过迭代器访问

set<typename>::iterator it;

eg:
set<int>::iterator it;
set<double>::iterator it;
//这样就得到了迭代器 it ,并且可以通过 *it 来访问 set 里元素。

由于除开 vector 和 string 之外的 STL 容器都不支持 *(it+i) 的访问方式,因此只能按如下方式枚举:

#include<stdio.h>
#include<set>
using namespace std;
int main()
{set<int> st;for (int i = 1; i <= 5; i++){st.insert(i);}for (set<int>::iterator it = st.begin(); it != st.end(); it++){printf("%d ", *it);}return 0;
}

四、set 常用函数实例解析

(1)insert()

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

(2)find()

find(value) 返回 set 中对应值为 value 的迭代器,时间复杂度为 O(logN),其中 N 为 set 内的元素个数。

#include<stdio.h>
#include<set>
using namespace std;
int main()
{set<int> st;for (int i = 5; i >= 1; i--){st.insert(i);}set<int>::iterator it = st.find(2); //在 set 中查找2,返回其迭代器。printf("%d ", *it);return 0;
}

(3)erase()

1. 删除单个元素。

删除单个元素有两种方法:

(1)st.erase(it)  ,即删除迭代器为 it 处的元素,时间复杂度为 O(1)。可以结合 find() 函数来使用。示例如下:

#include<stdio.h>
#include<set>
using namespace std;
int main()
{set<int> st;for (int i = 5; i >= 1; i--){st.insert(i*100);}st.erase(st.find(200)); //利用 find() 函数找到200,然后用 erase 删除它。for (set<int>::iterator it = st.begin(); it != st.end(); it++){printf("%d \n", *it);}return 0;
}

(2)st.erase(value)  ,value 为所需要删除元素的值。时间复杂度为 O(logN),N 为 set 内的元素个数。示例如下:

#include<stdio.h>
#include<set>
using namespace std;
int main()
{set<int> st;for (int i = 5; i >= 1; i--){st.insert(i*100);}st.erase(200); //用 erase 删除200。for (set<int>::iterator it = st.begin(); it != st.end(); it++){printf("%d \n", *it);}return 0;
}

2. 删除一个区间内的所有元素。

erase(first,last) 即删除 [first,last) 内的所有元素。其中 first 为所需要删除区间的起始迭代器,而 last 则为所需要删除区间的末尾迭代器的下一个地址。时间复杂度为 O(last-first)。

#include<stdio.h>
#include<set>
using namespace std;
int main()
{set<int> st;for (int i = 5; i >= 1; i--){st.insert(i*100);}st.erase(st.find(300),st.end()); for (set<int>::iterator it = st.begin(); it != st.end(); it++){printf("%d \n", *it);}return 0;
}

(4)size()

size() 用来获得 set 中元素的个数,时间复杂度为 O(1)。size()返回的是 unsigned 类型,不过一般来说用 %d 不会出很大问题,这一点对所有 STL 容器都是一样的。

(5)clear()

clear() 用来清空 set 中的所有元素,时间复杂度为 O(N),其中 N 为 set 中元素的个数。

五、set 的常见用途

set 最主要的作用是自动去重并按升序排序,因此碰到需要去重但是却不方便直接开数组的情况,可以用 set 解决。

set 中元素是唯一的,如果需要处理不唯一的情况,则需要使用 multiset。

unordered_set 可以用来处理只去重但不排序的需求,速度比 set 要快得多。

C++中set使用详细说明相关推荐

  1. pythonexcel介绍_Python 中pandas.read_excel详细介绍

    Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r& ...

  2. android webview详情,Android中的WebView详细介绍

    Android中WebView的详细解释: 1. 概念: WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页. 2. 使用方法: (1).实例化 ...

  3. ASP.NET中 DropDownList+DetailsView(详细视图)的使用前台绑定

    ylbtech-ASP.NET-Control-Bind:DropDownList+DetailsView(详细视图)的使用前台绑定 ASP.NET中 DropDownList+DetailsView ...

  4. 2020-12-09 深度学习 卷积神经网络中感受野的详细介绍

    卷积神经网络中感受野的详细介绍 1. 感受野的概念 在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射 ...

  5. ORACLE RAC 中 SRVCTL 命令详细说明

    ORACLE RAC 中 SRVCTL 命令详细说明           注:             RAC:     Real Application Clusters             S ...

  6. 英语中的介词详细解释

    英语中的介词详细解释 xixi2015-01-05 10:02:58 转载于:https://www.cnblogs.com/lyhabctranslate/p/4202991.html

  7. Jquery中AJAX参数详细介绍

    转载:http://www.cnblogs.com/qiufuwu618/archive/2012/12/20/2826190.html Jquery中AJAX参数详细列表: 参数名 类型 描述 ur ...

  8. php return直接输出,PHP中return用法详细解读

    原标题:PHP中return用法详细解读 在大部分编程语言中,return关键字可以将函数的执行结果返回,PHP中return的用法也大同小异,对初学者来说,掌握PHP中return的用法也是学习PH ...

  9. JavaScript异步编程【中】 -- Promise 详细解析

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在ES6中,新增加了一种异步编程的解决方案Promise,它是一种规范,是一套处理JavaScript异步的机制. Promise的含义 简单来说, ...

  10. Linux(二):VMware虚拟机中Ubuntu安装详细过程

    Linux(二):VMware虚拟机中Ubuntu安装详细过程 文章目录 1 准备 2 安装 2.1 虚拟机的建立 2.2 虚拟机安装Ubuntu系统 2.3 虚拟机设置 3 完成 1 准备 1.操作 ...

最新文章

  1. WPF XAML 资源样式模板属性存放位置
  2. 微软Entity Framework安装和初步研究
  3. hexo 博客支持PWA和压缩博文
  4. 【Python】青少年蓝桥杯_每日一题_5.21_画扇子
  5. (继承)virtual与访问控制
  6. Java spark中的各种范型接口Function的区别(持续更新中)
  7. 微抖动,繁忙的等待和绑定CPU
  8. 分类任务如何用逻辑回归实现_如何用逻辑回归构建金融评分卡模型?(上)
  9. 大数据学习笔记34:Hive - 数据库与表操作
  10. ROS学习笔记基础1(Ubuntu16.04安装ROS和依赖包)
  11. RDLC使用手册_RDLC报表部署
  12. selenium BY定位
  13. 顶点计划 挑战性课程讨论
  14. android的简单知识,Android基础知识(简单实例计算器)
  15. MySQL 入门(七)—— 视图
  16. 小米手机计算机连接设置方法,小米手机怎么连接电脑并上网?小米手机USB共享上网方法详细图解...
  17. 被讨厌的勇气:共同体感觉
  18. 【bfs】拯救少林神棍(poj1011)
  19. 正面管教读书笔记 02 几个基本概念
  20. wps 字体对系统无效_linux版WPS系统缺失字体的解决办法

热门文章

  1. dlna(Upnp媒体服务器)开发
  2. 等待事件系列(1)--User I/O类型
  3. 中软python机试_中软国际入职机试题
  4. vim编辑器常用操作及快捷键
  5. java第二作业 手动输入数赋值给数组 求最大值最小值 ,,,,,,输入一个数字 插如数组里 并且保持降序
  6. 【EMC电磁兼容】01.01——缘由及认证
  7. Java——课设——图书管理系统实现 2.0
  8. 盐城北大青鸟十二月一日小报
  9. 激光SLAM技术总结(4)V-LOAM算法测试( KITTI 数据集)上
  10. 微信小程序生成小程序二维码注意事项