set集合容器实现了红黑树的平衡二叉检索树的数据结构,在插入元素时候它会自动调整二叉树的排列,把元素放在适当的位置,以确保每个子树根节点的键值都大于左子树的所有节点的键值,而小于右子树的所有节点的键值;另外,还得确保根节点的左子树的高度与右子树的高度相等,这样,二叉树的高度最小,从而是检索的速度最快。要注意的是,它不会重复插入相同的键值,而采取忽略处理。

平衡二叉树的检索方法使用中序遍历算法,检索效率高于vector,deque和list等容器。

对于set容器中的键值,不可以直接去修改。因为如果把容器中的一个键值改了,set容器会根据新的键值旋转子树,以保持新的平衡,这样修改的键值可能就不在原先的位置了。换句话说,构造set集合的主要目的就是为了快速检索。multiset(多重集合容器),map(映照容器)和multimap(多重映照容器)的内部结构都是平衡二叉检索树。

 //元素的插入与中序遍历
#include<iostream>
#include<set>
using namespace std; int main(int argc,char *argv[])
{
set<int>s;
s.insert();
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 10 21 set<int>::reverse_iterator rit;//反向遍历
22 for(rit=s.rbegin();rit!=s.rend();rit++)
23 cout<<*rit<<" ";
cout<<endl; //运行结果:10 8 6 1
25 return ;
}

set容器之元素的检索,使用find()方法对集合进行搜索,如果找的查找的键值,则返回

该键值的迭代器位置,否则返回集合最后一个元素后面的一个位置,即end()。

 #include<iostream>
#include<set>
using namespace std; int main(int argc,int argv[])
{
set<int>s; s.insert();
s.insert();
s.insert();
s.insert(); s.insert();
set<int>::iterator it;
it=s.find(); if(it!=s.end())
cout<<*it<<endl;
else
cout<<"not find it"<<endl; it=s.find(); 25 if(it!=s.end())
cout<<*it<<endl;
else
cout<<"not find it"<<endl;
return ;
} /*
运行结果:
6
not find it
*/

set容器编写比较函数有两种方法:

(1)如果元素不是结构体,那么,可以编写比较函数。

(2)如果元素是结构体,那么,可以直接把比较函数写在结构体内。

第一方法:如果元素不是结构体,那么,可以编写比较函数。

 #include<iostream>
#include<set>
using namespace std; struct myComp
{
bool operator()(const int &a,const int &b)
{
if(a!=b)
return a>b;
else
12 return a>b;
}
}; int main(int argc,char *argv[])
{
set<int,myComp>s;
s.insert();
s.insert();
s.insert();
s.insert();
s.insert();
set<int,myComp>::iterator it; for(it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
cout<<endl;
return ;
} //运行结果:12 8 6 1

第二种方法:如果元素是结构体,那么,可以直接把比较函数写在结构体内。

 #include<iostream>
#include<set>
#include<string>
using namespace std; struct Info
{
string name;
double score;
bool operator<(const Info &a)const
{
return a.score<score;
}
}; int main(int argc,char *argv[])
{
set<Info>s;
Info info; info.name="Tom";
info.score=80.5;
s.insert(info); info.name="Nacy";
info.score=60.8;
s.insert(info); info.name="Jack";
info.score=90.8;
s.insert(info); set<Info>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it).name<<" "<<(*it).score<<endl;
return ;
}
/*
运行结果:
Jack 90.8
Tom 80.5
Nacy 60.8
*/

C++ -- STL泛型编程(二)之set的更多相关文章

  1. hdu5438 Ponds[DFS,STL vector二维数组]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu5438 题干 代码和解释 解答本题时参考了一篇代码较短的博客,比较有意思,使用了STL vector二维数组. 可以结合下面的示例代码理解: ...

  2. C++ STL泛型编程——在ACM中的运用

    学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...

  3. ACM竞赛常用STL(二)之STL--algorithm

    <algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的.下面列举出<algorithm>中的模板函数: adjacent_find / binary ...

  4. STL学习二:Vector容器

    1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...

  5. C++ -- STL泛型编程(一)之vector

    STL提供三种组件:容器,迭代器,算法,它们都支持泛型程序设计标准容器有两类:顺序容器和关联容器. 顺序容器(vector,list,deque,string等)是一系列元素的有序组合. 关联容器(s ...

  6. STL之二:vector容器用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...

  7. C++STL(二)——vector容器

    STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...

  8. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  9. 侯捷STL学习(二)

    第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...

随机推荐

  1. 2013-7-31hibernate二级缓存

    难得闲 Fckeditor Fckconfig.js大部分配置都在这里面, 增加字体:         程序代码: FCKConfig.FontNames = 'Arial;Comic Sans MS ...

  2. 【Python学习】request库

    Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...

  3. 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】

    转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...

  4. java并发编程实战笔记---(第三章)对象的共享

    3.1 可见性 synchronized 不仅实现了原子性操作或者确定了临界区,而且确保内存可见性. *****必须在同步中才能保证:当一个线程修改了对象状态之后,另一个线程可以看到发生的状态变化. ...

  5. POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))

    题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...

  6. MVC – 9.mvc整体请求流程

    1.请求管道 2~5微软自己的验证,我们一般不用. 在全局配置文件中-已经配置一个路由过滤器-为第7个事件注册了路由方法 1.在application_start中向静态路由表注册了路由数据,在管道第 ...

  7. IEEEXtreme 10.0 - N-Palindromes

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...

  8. DB First 中对Repository 层封装的几点小记

    在数据库表创建完成的情况下,使用DB First 进行开发,封装底层会遇到一些小问题,在此记录一下,供以后参考. 主要解决的问题有: 1.EF上下文管理 2.BaseRepository的封装 3.E ...

  9. lr总结

    最近一直在用Loardrunner做性能测试,记录下自己在工作中遇到的问题. LR的基本设置 首先是录制,在录制前选择TOOLS-recording options 在General中选择record ...

  10. Codeforces Round #496 (Div. 3) F - Berland and the Shortest Paths

    F - Berland and the Shortest Paths 思路:还是很好想的,处理出来最短路径图,然后搜k个就好啦. #include<bits/stdc++.h> #defi ...