• Gengxin讲STL系列——Set


    本系列第二篇blog

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

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

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

      第一:定义一个set

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

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

     1 /*从初始定义set升序或降序排列*/
     2 //set<变量类型,less<变量类型>> 变量名; less<>是升序,greater<>是降序
     3 set<int,less<int>>   set1;//升序
     4 set<int,greater<int>> set2;//降序

    5 /*用set初始化set*/ 6 set<int> set3;//普通的定义一个set 7 set<int> set4(set3);//用之前定义的set来初始化新定义的set
    8 /*用其他变量初始set*/ 9 //例子是用vector的区间来初始化set,关于vector,参考本系列另一篇博客(未写) 10 vector<int> v; 11 set<int> set3(v.begin(),v.end()); 12 /*后面括号里的是两个指针,代表的是v的开始和结束这个区间。*/ 13 //当然同理,你也可以用下面这种方式来初始化set: 14 int a[100];//定义一个普通的一维数组 15 set<int> set4(a+0,a+50);//你一定还记得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.例子如下:

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

      很明显,输出结果必然是

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

      

      第三:遍历集合

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

        先上代码

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

        其实遍历就是辣么简单~

      第四:其他操作

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

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

       第五:其他

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

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

  • 相关阅读:
    剑指Offer
    剑指Offer
    ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)
    less文件的样式无法生效的一个原因,通过WEB浏览器访问服务器less文件地址返回404错误
    Sqlserver Sql Agent Job 只能同时有一个实例运行
    SSAS 聚合设计提升CUBE的查询性能(转载)
    SQL SERVER: 合并相关操作(Union,Except,Intersect)
    SQL Server安装完成后3个需要立即修改的配置选项(转载)
    收缩TempDB的办法(转载)
    SSIS 关于并发的两个设置
  • 原文地址:https://www.cnblogs.com/zhangone/p/5566045.html
Copyright © 2020-2023  润新知