C++ -- STL泛型编程(二)之set
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的更多相关文章
- hdu5438 Ponds[DFS,STL vector二维数组]
目录 题目地址 题干 代码和解释 参考 题目地址 hdu5438 题干 代码和解释 解答本题时参考了一篇代码较短的博客,比较有意思,使用了STL vector二维数组. 可以结合下面的示例代码理解: ...
- C++ STL泛型编程——在ACM中的运用
学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...
- ACM竞赛常用STL(二)之STL--algorithm
<algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的.下面列举出<algorithm>中的模板函数: adjacent_find / binary ...
- STL学习二:Vector容器
1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...
- C++ -- STL泛型编程(一)之vector
STL提供三种组件:容器,迭代器,算法,它们都支持泛型程序设计标准容器有两类:顺序容器和关联容器. 顺序容器(vector,list,deque,string等)是一系列元素的有序组合. 关联容器(s ...
- STL之二:vector容器用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...
- C++STL(二)——vector容器
STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
- 侯捷STL学习(二)
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
随机推荐
- ORACLE ASM中查询表空间使用情况、数据文件路径、裸设备磁盘总大小剩余大小
在ASM中:查询所有磁盘名称.总大小.剩余大小:单位MB-----查看组的信息(总大小)select name,total_mb, free_mb from v$asm_diskgroup; ---查 ...
- 64_p1
PEGTL-devel-1.3.1-2.fc26.i686.rpm 13-Feb-2017 22:10 64086 PEGTL-devel-1.3.1-2.fc26.x86_64.rpm 13-Feb ...
- 用Centos7搭建小微企业Samba文件共享服务器【转】
转自 用Centos7搭建小微企业Samba文件共享服务器 - 今日头条(www.toutiao.com)http://www.toutiao.com/i6436937837660078593/ 最近 ...
- HttpURLConnection传json
private static String sendToWangTing(DataRow dataRow) throws IOException{ String ip = Configuration. ...
- C/C++——库函数strcpy和strdup比较
版权声明:原创文章,禁止转载. 1. strcpy 原型: extern char *strcpy(char *dest,char *src); 用法: #include <string.h&g ...
- Web开发:URL编码与解码
通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key= ...
- Tornado入门资料整理
预备知识 没学过计网的苦逼找点现成一些的东西看吧…… <Restful Web Services>,<HTTP The Definitive Guide>,各种RFC WSGI ...
- 易普优APS 5.0高级计划排程系统助力工业4.0智能工厂建设
(一)智能工厂建设核心 <中国制造2025>明确提出要推进制造过程智能化,智能工厂是实现智能制造的重要载体.作为智能工厂,在生产过程应实现自动化.透明化.可视化.精益化的同时,产品检测.质 ...
- 十四 oracle 视图
一.介绍视图是一张虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视 ...
- openssl 获取证书中的公钥
PEM 格式 1. FILE *fp = fopen("xx.pem", "r"); 2. X509 *cert = PEM_read_X509(fp, N ...