关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍。

  构造set集合容器的目的是为了去重+排序+快速搜索。由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插入或者删除是,均能自动调整二叉树,使得二叉树始终保持新的平衡。除set外,multiset,map,multimap的内部结构也是平衡二叉树。

  

 /*关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍。
set集合容器的主要目的是为了加快检索,当有某种数据类型需要去重加排序的时候,使用起来去重非常方便,
而且查找效率非常高。
*/
#include <set>//头文件,与multiset相同
#include <iostream>
using namespace std; //自定义比较函数myComp,重载"()"操作符
struct myComp{
bool operator () (const int &a,const int &b){
return a>b;//由大到小
}
}; //直接将比较函数写在结构体内
struct STUDENT{
string name;
double score; //重载"<"操作符,自定义排列规则
bool operator < (const STUDENT &a) const{
//按score由大到小排列。如果由小到大排列,使用">"号即可
return a.score < score;
}
}; void print(set<int> s);
void rprint(set<int> s); int main()
{
/*创建set集合对象,格式为set<元素类型> 集合对象标识符*/
set<int> s;//定义了一个元素类型为int的集合对象s,当前没有任何元素 /*元素的插入和遍历(对平衡二叉检索树的中序遍历)*/
//插入过程也是排序过程,排序采用默认的比较规则,使得set集合的数据结构始终保持平衡二叉检索树
//也可以自定义比较规则函数
s.insert();//第一次插入8,可以插入
s.insert();
s.insert();
s.insert();
s.insert();//第二次插入8,重复元素,不可以插入,从而达到去重的效果 //中序正向遍历集合中的所有元素
set<int>::iterator it;//定义前向迭代器
for(it=s.begin(); it != s.end(); it++){
cout<<*it<<' ';
}
cout<<endl;
/*运行结果
1 6 8 12
*/
//中序反向遍历集合中的所有元素
set<int>::reverse_iterator rit;
for(rit=s.rbegin(); rit != s.rend();rit++){
cout<<*rit<<' ';
}
cout<<endl;
/*运行结果
12 8 6 1
*/ /*要想检索集合中是否存在等于某个键值的元素,则使用find()方法,如果找到则返回该键值的迭代器位置,
否则,返回集合最后一个元素后面的一个位置,即end()*/
set<int>::iterator it1;//定义迭代器接收find()方法的返回值
it1=s.find();
if(it1 != s.end())
cout<<"找到键值为 "<<*it1<<"的元素\n";
it1=s.find();
if(it1 == s.end())
cout<<"没有找到键值为 1的元素\n";
/*运行结果
找到键值为 12的元素
没有找到键值为 1的元素
*/ /*元素的删除*/
//要想删除等于某个键值时,使用erase()方法
cout<<"删除前:\n";
print(s);
s.erase();//删除键值为6这个元素
cout<<"删除后:\n";
print(s);
/*运行结果
删除前:
1 6 8 12
删除后:
1 8 12
*/ //要想清空集合
cout<<"清空前:\n";
print(s);
s.clear();
cout<<"清空后:\n";
print(s);
/*运行结果
清空前:
1 8 12
清空后: */ /*注意使用insert()将元素插入到集合中去的时候,集合会根据设定的比较函数将元素放到相应的结点上。当没有制定比较
函数的时候采用默认比较函数,即按键值由小到大的顺序插入*/ /*插入时编写比较函数的两种方法*/
//如果元素是基本数据类型,见main函数之前的定义方法
set<int,myComp> ss;
ss.insert();//同样,第一次插入,第二次重复元素不插入
ss.insert();
ss.insert();
ss.insert(); set<int,myComp>::iterator it2;//定义同元素类型的前向迭代器
for(it2=ss.begin(); it2 != ss.end(); it2++){
cout<<*it2<<' ';
}
cout<<endl;
/*运行结果
12 8 6 1
*/ //如果元素是结构体,可以将比较函数写在结构体内,见main函数之前的定义方法
set<STUDENT> students;
STUDENT someone;
someone.name="Jack";
someone.score=80.5;
students.insert(someone); someone.name="Tomi";
someone.score=57.5;
students.insert(someone); someone.name="Nacy";
someone.score=60.5;
students.insert(someone); set<STUDENT>::iterator it3;//定义前向迭代器
for(it3=students.begin(); it3 != students.end();it3 ++){
cout<<(*it3).name<<":"<<(*it3).score<<endl;
}
/*运行结果
Jack:80.5
Nacy:60.5
Tomi:57.5
*/
return ;
} void print(set<int> s)
{
set<int>::iterator it;//定义前向迭代器
for(it=s.begin(); it != s.end(); it++){
cout<<*it<<' ';
}
cout<<endl;
} void rprint(set<int> s)
{
set<int>::reverse_iterator rit;//定义反向迭代器
for(rit=s.rbegin(); rit != s.rend();rit++){
cout<<*rit<<' ';
}
cout<<endl;
}

set集合容器(常用的使用方法总结)的更多相关文章

  1. 【STL】 set集合容器常用用法

    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...

  2. multiset多重集合容器(常用的使用方法总结)

    关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复 ...

  3. map映照容器(常用的使用方法总结)

    map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...

  4. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  5. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  6. SVG DOM常用属性和方法介绍(1)

    12.2  SVG DOM常用属性和方法介绍 将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析 ...

  7. [转载]Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  8. SERVLET类常用接口及方法

    SERVLET类常用接口及方法 2011-09-09 16:14:43    [size=xx-small]SERVLET类常用接口及方法2007年04月05日 星期四 04:46 P.M.基本类和接 ...

  9. 面霸篇:Java 集合容器大满贯(卷二)

    面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...

随机推荐

  1. AngularJS 指令中的 replace:true

    默认值是fasle,模板会被当作子元素插入到调用此指令的元素内部. <my-directive></my-directive> myModule.directive(" ...

  2. UNIGUI集成HTML导航

    UNIGUI集成HTML导航 先来一个效果图: ajaxRequest(MainForm.window,'openform',[]); procedure TMainForm.UniFormAjaxE ...

  3. 深入探索AngularJS

    目录 深入探索AngularJS 作用域Scope是DOM和Directives交互的抽象 Scope是POJO对象 Scope是上下文 Scope继承树 Scope附加功能 正交功能 Element ...

  4. 使用JAVA API 解析ORC File

    使用JAVA API 解析ORC File orc File 的解析过程中,使用FileInputFormat的getSplits(conf, 1)函数, 然后使用 RecordReaderreade ...

  5. jQuery---ajax---error函数及其参数详解

    使用jquery的ajax方法向服务器发送请求的时候,常常需要使用到error函数进行错误信息的处理,本文详细说明了ajax中error函数和函数中各个参数的用法. 一般error函数返回的参数有三个 ...

  6. 如何获取SQL中Print语句输出内容

    SqlConnection cn = new SqlConnection("server=my\\my2005;database=rdwhdata2005;user id=zjh;passw ...

  7. 【转】 js数组 Array 交集 并集 差集 去重

    原文:http://blog.csdn.net/ma_jiang/article/details/52672762 最劲项目需要用到js数组去重和交集的一些运算,我的数组元素个数可能到达1000以上, ...

  8. 【Vue】浅谈Vue不同场景下组件间的数据交流

    浅谈Vue不同场景下组件间的数据“交流”   Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...

  9. iOS--各种bug详解

    1.为什么传的参数都对,但是就是请求不下来数据. 答:检查下传的字符串中,是不是有多的空格. 例如: 错误:{"startIndex":"1","en ...

  10. JS获取客户端IP地址、MAC和主机名的7个方法汇总

    今天在搞JS(javascript)获取客户端IP的小程序,上网搜了下,好多在现在的系统和浏览器中的都无效,很无奈,在Chrome.FireFox中很少搞到直接利用ActiveX获取IP等的JS脚本. ...