本系列第二篇blog

第一篇写的心潮澎湃,结果写完一看,这都是些什么玩意= =|

  Set的中文名称是“集合”。集合,高一数学必修一课本给出的定义已经很明确了,简单来讲就是一个不含重复元素的空间(个人定义)。也就是说,如果一个元素已经存在于set中,那么无论继续放入这个数据多少遍,这个set里的同一个元素也不会出现第二遍。也就是说,set很方便的自动实现了去重这个功能。而且,如果利用迭代器遍历set里的数据,遍历结果将会是有序的。So,set就自动实现去重+排序的功能了。具体实现采用了红黑树的平衡二叉树的数据结构。ps:multiset是一个跟set差不多的stl容器,不过set里的元素是不重复的,而multiset里的元素是允许重复的。如果愿意,可以去了解了解multiset(跟set基本一样的,但是暂时没啥卵用)

  既然set这么方便,那就开始讲吧……

  第一:定义一个set

 #include<set>//set的头文件!!!一定不要忘了
//set<变量类型> 变量名;
set<int> lalala;//可以这样
set<char> lalala;//可以这样
set<bool> lalala;//可以这样
set<string> lalala;//更可以这样~

   当然,这是一种简单粗暴的基本方式。如果想要高级一点的,那就看下面这几种方式:

 /*从初始定义set升序或降序排列*/
//set<变量类型,less<变量类型>> 变量名; less<>是升序,greater<>是降序
set<int,less<int>> set1;//升序
set<int,greater<int>> set2;//降序 /*用set初始化set*/
set<int> set3;//普通的定义一个set
set<int> set4(set3);//用之前定义的set来初始化新定义的set

/*用其他变量初始set*/
//例子是用vector的区间来初始化set,关于vector,参考本系列另一篇博客(未写)
vector<int> v;
set<int> set3(v.begin(),v.end());
/*后面括号里的是两个指针,代表的是v的开始和结束这个区间。*/
//当然同理,你也可以用下面这种方式来初始化set:
int a[];//定义一个普通的一维数组
set<int> set4(a+,a+);//你一定还记得sort(a+0,a+100),是吗?

  第二:往集合里添加数据

//set变量名.insert(添加的变量)
set<string> lalala;
lalala.insert("a");

    其实,上面展示的同样也是最最简单粗暴的方式,已经基本能够满足普通的需求,下面列举其他详细用法:

      如果set里已经有某个数据了,怎么看?当然,set会告诉你:

      像这样:

     set变量名.insert(要包含的变量).second;

      如果set里本来就存在里某个元素,这时再去insert这个元素,那么second将会返回0.

      也就是说,如果插入成功,second就会返回1,失败返回0.例子如下:

 set<int> set1;
if(set1.insert().second==){//第一次插入,集合里没有1这个元素,插入成功,返回1
cout<<"我插入成功啦~~~";
} if(set1.insert().second==){//第二次插入,集合里已经存在1这个元素,所以返回0
cout<<"我插入成功啦~~~"<<endl;
}
else{
cout<<"好像插入失败了呢~"<<endl;//因为返回0,所以执行else里的内容
}

 很明显,输出结果必然是

我插入成功啦~~~
好像插入失败了呢~

  

  第三:遍历集合

    那么这里就需要介绍迭代器了。

    先上代码

 set<int>::iterator it;
for(it = set4.begin();it!=set4.end();it++)cout<<*it;

    其实遍历就是辣么简单~

  第四:其他操作

    当然,set和其他stl一样,也有很多操作函数。那么下面就对set的有关操作函数来个简单的介绍:

 set<int> set1;
set1.empty()//如果集合为空,则返回true,否则返回false
set1.begin()//返回set1第一个元素的指针(还记得上面我说迭代器的时候用到的吗)
set1.end()//返回set1最后一个元素的指针(同上)
set1.count()//和其他STL一样,.count()返回容器的里元素的个数
set1.size()//同上
set1.erase(指针)//删除容器里指针所指向的元素
set1.find()//查找某元素是否存在于容器中。如果存在,返回指针,不存在返回.end()
set1.clear()//清空容器中所有元素
set1.swap(set2)//交换set1和set2两个容器的元素
/*clear可以删除所有元素但不能删除容器占用的内存,可以利用swap来释放内存(奥赛暂时用不到)*/

   第五:其他

    其实set还有其他一些高级操作函数(反正我是这么叫它们),如求两个集合 的并集,交集等等,奥赛一般的话用不到吧……所以我就不讲了(其实可以通过自己实现的,用到的时候自己试试)

  感谢有人能在我blog上看我乱bb,感谢学弟的支持。

Gengxin讲STL系列——Set的更多相关文章

  1. Gengxin讲STL系列目录

    引言:有人催我写关于STL的博客#(滑稽)        STL嘛,昨晚有人一直逼问我STL名字的由来——STL = Standard Template Library,标准模板库,惠普实验室开发的一 ...

  2. Gengxin讲STL系列——String

    衔接上一篇引导. 作为第一篇博客,就要大气一点. 可我好像并不知道怎么才能让自己的博客大气一点= =: 明天是我生日,自己先买个中文域名庆祝了一下…… 好了,废话说完了,结果博客也没大气到哪去……,正 ...

  3. Gengxin讲STL系列——Queue和Stack

    第三篇. 感觉队列和栈是必须的……所以决定加上这两个…… 我发现我已经买域名买上隐了……今天又买了个.top……真是智障…… Queue(队列FIFO)和Statk(栈LIFO). 那么为什么要这两个 ...

  4. 《STL系列》之map原理及实现

    上一篇文章<STL系列>之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现.STL实现源码下载.STL中map的实现是基于RBTree的,我在实现的时 ...

  5. 给小班讲stl 之 map、sort、优先队列

    引子:最近老师让给小班讲课,讲stl,,但是我觉得就小班现在这水平根本讲不懂好不好,,,,

  6. 跟我学STL系列(1)——STL入门介绍

    一.引言 最近这段时间一直都在自学C++,所以这里总结下自己这段时间的学习过程,通过这种方式来巩固自己学到的内容和以备后面复习所用,另外,希望这系列文章可以帮助到其他自学C++的朋友们. 由于本人之前 ...

  7. 《STL系列》之vector原理及实现

    最近忙得蛋疼,但还是想写点属于自己的东西.也不知道写点啥,最后决定试着自己实现STL中常用的几个集合,一来加深自己对STL的理解,二来看看自己是否有这个能力实现.实现目标就是:1能和STL兼容:2最大 ...

  8. STL系列

    STL—对象的构造与析构 STL—内存的配置与释放 STL—vector STL—vector空间的动态增长

  9. hdoj1027【STL系列。。。?】

    这个太夸张了...感觉是有别的方法,但是觉得再说吧...以后碰到全排列应该也是用STL嗨的吧...嗯,,,就是这样的....?再说,再说.. 还有杭电支持c艹11,很棒 #include <bi ...

随机推荐

  1. winPcap_1_开篇

    什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 因为有些应用程序需要直接访问网络中的数据包.也就是说,那些应用程序需要访问原始数据包,即没有被操 ...

  2. jquery validate form 异步提交

    jQuery取得select选中的值 jQuery("#select1  option:selected").text(); 相信很多人都用过jquery validate插件,非 ...

  3. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  4. Python函数小结(2)-- 装饰器、 lambda

    本篇依然是一篇学习笔记,文章的结构首先讲装饰器,然后讲lambda表达式.装饰器内容较多,先简要介绍了装饰器语法,之后详细介绍理解和使用不带参数装饰器时应当注意到的一些细节,然后实现了一个简单的缓存装 ...

  5. 使用 JUnit 进行单元测试 - 教程

    tanyuanji@126.com 版本历史 JUnit 该教程主要讲解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit   目录 tanyuanji@126. ...

  6. FP—Growth算法

    FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点: 第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录, ...

  7. android run process

    http://www.jb51.net/article/32798.htm http://www.elecfans.com/tongxin/119/20120315263977.html 图 1 详细 ...

  8. 《Programming WPF》翻译 第9章 1.自定义控件基础

    原文:<Programming WPF>翻译 第9章 1.自定义控件基础 在写一个自定义控件之前,你需要问的第一个问题是,我真的需要一个自定义控件吗?一个写自定义控件的主要原因是为了用户界 ...

  9. Hive 12、Hive优化

    要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1. ...

  10. 表单验证插件jquery.validate的使用方法演示

    jQueryValidate表单验证效果 jquery.validate验证错误信息的样式控制 <!--validate验证插件的基础样式--> input.error{border: 1 ...