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. MAC泛洪攻击

    先来解释一下啥是泛洪攻击 交换机里有一张专门记录MAC地址的表,为了完成数据的快速转发,该表具有自动学习机制:泛洪攻击即是攻击者利用这种学习机制不断发送不同的MAC地址给交换机,充满整个MAC表,此时 ...

  2. logging模块配置笔记

    logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ...

  3. Keras自定义评估函数

    1. 比较一般的自定义函数: 需要注意的是,不能像sklearn那样直接定义,因为这里的y_true和y_pred是张量,不是numpy数组.示例如下: from keras import backe ...

  4. UVA题解二

    UVA题解二 UVA 110 题目描述:输出一个Pascal程序,该程序能读入不多于\(8\)个数,并输出从小到大排好序后的数.注意:该程序只能用读入语句,输出语句,if语句. solution 模仿 ...

  5. 用sar进行CPU利用率的分析

    07:40:17 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle07:40:19 PM       a ...

  6. Qt跨线程调用错误解析及解决办法

    错误提示:Error: Cannot create children for a parent that is in a different thread. 错误案例分析 新建SerialLink子线 ...

  7. zookeeper客户端连接报错

    [root@zoo1 zookeeper-3.4.10]# bin/zkCli.sh -server 172.16.1.10:2181 2017-10-27 00:37:59,326 [myid:] ...

  8. [重磅]Deep Forest,非神经网络的深度模型,周志华老师最新之作,三十分钟理解!

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 深度学习最大的贡献,个人认为就是表征 ...

  9. Adding Completion to (interactive)

      Adding Completion to (interactive) Author: Tubo Question: Is there any way to add my own completio ...

  10. Linux下突然不识别无线网卡

    昨天还能用wifi的Linux,今天进去后发现没有了wifi的图标,ifconfig也不显示无线网卡.怎么办? 出现这种情况,肯定是上次关机之前做了一些操作导致的.我遇到过的一个情况是:Fedora2 ...