1、set(集合)和 map(映射) 都属于关联容器,它们都支持查询一个元素是否存在,并能有效地获取元素。实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。

2、set中的元素总是从小到大排列,set通过二分查找树实现。

3、set具有两个特点:<1>在set容器中,不存在两个值相等。 <2>元素值就是关键词本身

4、如果要使用set类中的函数,需要使用以下包含命令

# include<set>

using namespace std;

5、构造set函数////////////构造set集合主要目的是为了快速检索,不可直接去修改键值。

set<数据类型> 数据名;

# include<iostream>
# include<set>
using namespace std;
int main()
{
set<int> s1;///////空set类
set<int>::iterator it;///////iterator这里就相当于指向节点的指针////it是个set类型的指针
int a[]={1,3,2,4,5};
set<int> s2(a,a+5); //////利用指针对象初始化set集合///并且会自动从小到大排序
set<int> s3(s2);//////////////利用拷贝构造函数初始化set集合
for(it=s2.begin();it!=s2.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
for(it=s3.begin();it!=s3.end();it++)/////begin函数与end函数------------返回set的第一个元素和最后一个元素的迭代器////
{
cout<<*it<<" ";
}
return 0;

}

6、set常用方法

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

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

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

empty()    ,判断set容器是否为空-------------如果空,返回true;否则,返回false

max_size()   ,返回set容器可能包含的元素最大个数

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

rbegin     ,返回的值和end()相同-------------------用于反向迭代器

rend()     返回的值和begin()相同------------------用于反向迭代器

7、反向迭代器

1. 定义
反向迭代器(Reverse_Iterator)是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问前一个元素,而--运算则访问下一个元素。
2. 作用
(1)反向迭代器需要使用自减操作符:标准容器上的迭代器(reverse_iterator)既支持自增运算,也支持自减运算。但是,流迭代器由于不能反向遍历流,因此流迭代器不能创建反向迭代器。
(2)可以通过reverse_iterator::base()将反向迭代器转换为普通迭代器使用,从逆序得到普通次序。这是因为:有些容器的成员函数只接受iterator类型的参数,所以如果你想要在ri所指的位置插入一个新元素,你不能直接这么做,因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator,坚持要求iterator。为了完成删除和一些形式的插入操作,你必须先通过base函数将reverse_iterator转换成iterator,然后用iterator来完成工作。

# include<iostream>
# include<set>
using namespace std;
int main()
{
set<int>::iterator it;
set<int>::reverse_iterator rit;///////////////////定义反向迭代器 rit
int a[5]={10,2,5,24,15};
set<int> s(a,a+5);
int i;

for(it=s.begin();it!=s.end();it++)
{
cout<<" "<<*it;
}
cout<<endl;
for(rit=s.rbegin();rit!=s.rend();rit++)//////////////记住
{
cout<<" "<<*rit;
}
return 0;
}

8、注意事项:begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.

9、set操作类函数

<1>insert函数----作用是将一个元素或一系列元素插入到set容器中。其中:

       第一个函数:先判断set中是否存在一个元素y 与 要插入元素x 相等 ,如果不存在,则将x插到适当位置,如果存在,则不插入

       第二个函数:从it开始寻找插入点,寻找有效的插入方法插入元素x

       第三个函数:将指定的元素序列[first,last]插入到set容器中

      对于第一个函数,如果插入成功,则返回pair(it,true);否则,返回pair(it,false).其中 it 迭代器

      对于第二个函数,函数返回新元素插入的位置或者已经存在相同元素的位置

# include<iostream>
# include<set>
using namespace std;
int main()
{
set<int> s; //////////////////声明一个空set类
set<int>::iterator it; //////////////////////声明一个set类的指针 it
pair<set<int>::iterator,bool> r;          //用来接收 insert 函数 的返回值
for(int i=1;i<=3;i++)
{
s.insert(i*10);                                       //插入10 20 30

}
r = s.insert(30);                                  //r接收 insert(30) 的返回值
if(r.second==false)                             //r.second 有两个返回值,插入成功返回true   插入失败返回false
{
it = r.first;                                      // r.first  表示当前迭代器  指向的位置
}
s.insert(it,32);                              //表示从 起始查找位置it  开始寻找 插入位置
s.insert(19);
int a[5]={6,20,4};
s.insert(a,a+3);                       // 20已经存在 不能插入
for(it=s.begin();it!=s.end();it++)
{
cout<<" "<<*it;
}
cout<<endl;
return 0;
}

10、

set(集合)类的更多相关文章

  1. python :列表 字典 集合 类 ----局部变量可以改全局变量

    #列表 字典 集合 类 ----局部变量可以改全局变量,除了整数和字符串 names=["alex","jack","luck"] def ...

  2. Java集合(类)框架(二)

    1.Set集合 1.1 HashSet集合 HashSet底层为哈希码 不是数组,因此没有下标的概念,也就不能根据下标来查询某个元素 存放元素无序,不可重复 1.1.1 声明 Set<Strin ...

  3. Java集合(类)框架(一)

    集合类均在java.util包之下 集合类方法的功能基本为增.删.改.查,部分外加方法除外(如toArray().toString()等) 1.List接口 底层为Object 数组,存放的数据可以重 ...

  4. Java集合(类)框架(三)

    1. Map集合 相较于List和Set集合而言,Map集合所储存的数据为双列行,数据是以key和value为一个单位进行存储的,如在建立一个学生Map的时候,其中的数据应为 学号-姓名(key-va ...

  5. Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...

  6. javase基础笔记4——异常/单例和类集框架

    继承 extends final关键 多态 是在继承的基础上 接口 interface 异常 exception 包的访问可控制权限 private default protect public 异常 ...

  7. 第九章:Javascript类和模块

    (过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某 ...

  8. Java_类文件及加载机制

    类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 ...

  9. Java 集合系列 12 TreeMap

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. 小目标 | DAX高级实践-Power BI与Excel联合应用

    · 适用人群:数据分析专业人士,在数据分析方向需求发展人士 · 应用场景:数据汇报.数据可视化展现.数据建模分析 · 掌握难度:★★★★☆ 本期讲师 DAX高级实践-Power BI与Excel联合应 ...

  2. 一键部署LNMP堆栈Web应用基础架构

    https://market.azure.cn/Vhd/Show?vhdId=9852&version=10884 产品详情 产品介绍LEMP/LNMP 是指一组通常一起使用来运行动态网站或者 ...

  3. 【TensorFlow入门完全指南】模型篇·线性回归模型

    首先呢,进行import,对于日常写代码来说,第二行经常写成:import numpy as np,这样会更加简洁.第三行import用于绘图. 定义了学习率.迭代数epoch,以及展示的学习步骤,三 ...

  4. CF Gym 100637G \#TheDress (水)

    题解:读懂题意按照题意模拟... 熟悉了一个库函数,strstr,memcpy #include<cstdio> #include<cstring> int main() { ...

  5. 什么样子的WordPress网站更受搜索引擎欢迎

    网站的导航功能对于搜索引擎而言是非常重要的 网站的导航功能对于帮助用户迅速找到他们想要的内容来说是很重要的.它对帮助搜索引擎理解该网站有哪些重要内容同样非常重要.虽然百度的搜索结果都是指向每一个特定的 ...

  6. linux之切换用户su(switch user)

    1.切换至root su 或 su root然后输入密码 这种只切换身份,不切换home工作目录 su - 或 su - root然后输入密码 这种不仅切换身份,而且切换home工作目录 2.切换至普 ...

  7. webservice基础

    一.webservice概念 webservice用于异构平台之间的交互,我用Java写的程序,可以用php..net.pythod等其它语言的程序来访问我的接口.webservice有很多框架帮我们 ...

  8. cocostudio的bug(1)

    今天有个女同事问我一个问题,两个cocostudio的ui同时addChild到一个layer上面,高层级的ui设置visible为false,低层级的ui设置的visible设置为true,然后低层 ...

  9. C语言预处理_05

    凡是以 “#”开头的均为预处理命令! 其定义的一般形式为: #define  标示符  字符串 对于宏定义说明以下几点: 1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种 ...

  10. spring bean的介绍以及xml和注解的配置方法

    5.Bean 下边我们来了解一下Bean的: Bean的作用域Bean的生命周期Bean的自动装配Resources和ResourceLoader 5.1Bean容器的初始化 Bean容器的初始化 两 ...