set容器简介:

1) set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列元素插入过程是按排序规则插入,所以不能指定插入位置。

2) set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。

3) set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。

4) multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次

5) 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

(红黑树的变体,查找效率高,插入不能指定位置,插入时自动排序)

set/multiset对象的默认构造

set<int> setInt;            //一个存放int的set容器。

set<float> setFloat;     //一个存放float的set容器。

set<string> setString;     //一个存放string的set容器。

multiset<int> mulsetInt;            //一个存放int的multi set容器。

multi set<float> multisetFloat;     //一个存放float的multi set容器。

multi set<string> multisetString;     //一个存放string的multi set容器。

set的插入与迭代器

set.insert(elem);     //在容器中插入元素。

set.begin();  //返回容器中第一个数据的迭代器。

set.end();  //返回容器中最后一个数据之后的迭代器。

set.rbegin();  //返回容器中倒数第一个元素的迭代器。

set.rend();   //返回容器中倒数最后一个元素的后面的迭代器。

set的大小

set.size();    //返回容器中元素的数目

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

set的删除

set.clear();            //清除所有元素

set.erase(pos);   //删除pos迭代器所指的元素,返回下一个元素的迭代器。

set.erase(beg,end);        //删除区间[beg,end)的所有元素    ,返回下一个元素的迭代器。

set.erase(elem);     //删除容器中值为elem的元素。

set的查找

set.find(elem);   //查找elem元素,返回指向elem元素的迭代器。

set.count(elem);   //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。

set.lower_bound(elem);  //返回第一个>=elem元素的迭代器。

set.upper_bound(elem);       //  返回第一个>elem元素的迭代器。

set.equal_range(elem);        //返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。

注:以上函数返回两个迭代器,而这两个迭代器被封装在pair中。

pair的使用

pair译为对组,可以将两个值视为一个单元。

pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。

pair.first是pair里面的第一个值,是T1类型, pair.second是pair里面的第二个值,是T2类型。

eg:

set<int> setInt;

...  //往setInt容器插入元素1,3,5,7,9

pair< set<int>::iterator , set<int>::iterator > pairIt = setInt.equal_range(5);

set<int>::iterator itBeg = pairIt.first;

set<int>::iterator itEnd = pairIt.second;

//此时 *itBeg==5  而  *itEnd == 7

示例:

/* set集合 元素唯一 自动排序 不能按照数组的方式插入元素红黑树*/
class A
{
public:
int age;
string name;
public:
A(int age, const char *name)
{
this->age = age;
this->name = name;
}
void print()
{
cout << name << " 对象的年龄是 " << age << endl;
}
}; //函数对象
//重载了"()"操作符的普通类对象。从愈发上将。它与普通函数行为类似
struct funcA
{
bool operator()(const A &left, const A &right)
{
return (left.age < right.age);
}
}; int main()
{
set<A, funcA> s1; //仿函数 函数对象 A a1(10, "张三1");
A a2(30, "张三2");
A a3(8, "张三3");
A a4(20, "张三4");
A a5(20, "张三5"); //typedef pair<iterator, bool> _Pairb
//如何判断insert函数返回值
s1.insert(a1);
s1.insert(a2);
s1.insert(a3);
pair<set<A, funcA>::iterator, bool> pair1 = s1.insert(a4);
if (pair1.second == true)
cout << "s4插入成功" << endl;
else
cout << "s4插入失败" << endl;
pair<set<A, funcA>::iterator, bool> pair2 = s1.insert(a5);
if (pair2.second == true)
cout << "s5插入成功" << endl;
else
cout << "s5插入失败" << endl; for (set<A, funcA>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << it->name << " 对象的年龄是 " << it->age << endl;
//it->print();
}
cout << endl;
} int main1()
{
//set<int> s1; //相当于 set<int, less<int> > s1 less就是仿函数 默认从小到大排列 set<int, greater<int> > s1; s1.insert(11);
s1.insert(22);
s1.insert(13);
s1.insert(26);
s1.insert(13);
s1.insert(14);
s1.insert(24); //默认情况下 从小到大排列
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
cout << *it << " ";
cout << endl; cout << "set的大小是:" <<s1.size() << endl;
while (!s1.empty())
{
set<int>::iterator it = s1.begin();
cout << "set的头部元素是:" << *it << endl;
s1.erase(it); //删除
} return 0;
} int main2()
{
set<int> s1; for (int i = 5; i < 15; i++)
s1.insert(i); for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
cout << *it << " ";
cout << endl; set<int>::iterator it1 = s1.find(11);
cout << "it1: " << *it1 << endl; cout << "出现5的个数num: " << s1.count(10) << endl; //小于10的元素的迭代器的位置
set<int>::iterator it2 = s1.lower_bound(10);
cout << "it2: " << *it2 << endl;
for (set<int>::iterator it = s1.begin(); it != it2; it++)
cout << *it << " ";
cout << endl; //大于10的元素的迭代器的位置
set<int>::iterator it3 = s1.upper_bound(10);
for (; it3 != s1.end(); it3++)
cout << *it3 << " ";
cout << endl; //s1.erase(11); //删除元素
pair<set<int>::iterator, set<int>::iterator> mpair = s1.equal_range(11);
cout << "左:" << *mpair.first << " 右: " << *mpair.second << endl; return 0;
}

set容器的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. 网页提交中文到WEB容器的经历了些什么过程....

    先准备一个网页 <html><meta http-equiv="Content-Type" content="text/html; charset=gb ...

  3. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  4. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  5. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  6. JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题

    1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...

  7. docker4dotnet #2 容器化主机

    .NET 猿自从认识了小鲸鱼,感觉功力大增.上篇<docker4dotnet #1 前世今生&世界你好>中给大家介绍了如何在Windows上面配置Docker for Window ...

  8. 深入分析Spring 与 Spring MVC容器

    1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...

  9. Set容器--HashSet集合

    Set容器特点: ①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ②   最常用的两个Set接口的实 ...

  10. 深入理解Spring--动手实现一个简单的SpringIOC容器

    接触Spring快半年了,前段时间刚用Spring4+S2H4做完了自己的毕设,但是很明显感觉对Spring尤其是IOC容器的实现原理理解的不到位,说白了,就是仅仅停留在会用的阶段,有一颗想读源码的心 ...

随机推荐

  1. JS面试题-<变量和类型>-JavaScript的数据类型

    前言 整理以前的面试题,发现问js数据类型的频率挺高的,回忆当初自己的答案,就是简简单单的把几个类型名称罗列了出来,便没有了任何下文.其实这一个知识点下可以牵涉发散出很多的知识点,如果一个面试者只是罗 ...

  2. STM32中断系统

    1.中断介绍:    1.1 中断概念 CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂 时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序 或中断处理程      ...

  3. 深入理解 DNS

    深入理解 DNS 简介 DNS(Domain Name System)域名系统,它是一个将域名和 IP 地址相互映射的一个分布式数据库,把容易记忆的主机名转换成主机 IP 地址. DNS使用 TCP ...

  4. T-SQL, Part I: LIKE Pattern

    The basic usage of LIKE pattern: %: it would be placed at the end and/or the beginning of a string. ...

  5. MySQL InnoDB 实现高并发原理

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  6. pat 1124 Raffle for Weibo Followers(20 分)

    1124 Raffle for Weibo Followers(20 分) John got a full mark on PAT. He was so happy that he decided t ...

  7. 在 Vue中使用layui日历控件,标注重要日子

    因为在vue文件中通过import加载,不知道为什么打包后会找不到js, 所以通过这种方法引入 在index.html中引入 文件目录 需要放在static目录下 <input type=&qu ...

  8. Docker从入门到实践(4-1)

    使用 Docker 镜像 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一. Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像. ...

  9. PL真有意思(四):控制流

    前言 对大多数计算模型而言,顺序都是基本的东西,它确定了为完成所期望的某种工作,什么事情应该最先做,什么事应该随后做,我们可以将语言规定顺序的机制分为几个类别: 顺序执行 选择 迭代 过程抽象 递归 ...

  10. 学习完vue指令 做的一个学生信息录入系统

    一.demo实现原理 输入完个人信息后  点击创建用户  数据就会显示在下面的表格中 用到了vue中的数据双向绑定 v-model v-for 还要js正则 数组的unshift splice 等方法 ...