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. 巅峰极客第二场CTF部分writeup

    word-MISC 微信回答问题+word字体里. sqli-WEB 注册个admin空格即可,长字符截断. 晚上把后续的写出来.现在睡觉

  2. SQLite3使用详解

    sqlite常量的定义(SQLite3返回值的意思): SQLITE_OK           = 0;  返回成功 SQLITE_ERROR        = 1;  SQL错误或错误的数据库 SQ ...

  3. 关于"轉淚點"与"轉捩點"

    经常看台湾偶像剧或台湾综艺节目的人,一定听过"转泪点"这个词,虽然我一直不知道这三个字具体是怎么写, 但其意思很容易明白,就是"转折点"的意思.今天无聊在看凤凰 ...

  4. nginx 各种配置

    first : mkdir /usr/local/nginx/conf/vhosts{网站配置}/usr/local/nginx/conf/vhosts/test.conf : server { li ...

  5. PHP利用rand(1,100)函数产生10个1~100之间的随机数

    //echo rand(1,100); $max=0; $min=100; for($i=0;$i<=9;$i++){ $rand[$i]=rand(1,100); if($rand[$i]&g ...

  6. Linux命令之dig命令实例讲解

    1.查看域名的A记录 # dig yahoo.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<> ...

  7. rmdir命令

    rmdir命令用来删除空目录.当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录.利用rmdir命令可以从一个目录中删除一个或多个空的子目录.该命令从一个目录中删除一个或多 ...

  8. [笔记]用gdb调试core dump

    总是隔一段时间才写一次C++,有些东西老是用完就忘了……记一下如何用gdb来调试core dump免得到时候又忘记. 首先需要设置core file的大小,默认是0所以不设不会生成core file ...

  9. spring boot 使用不同的profile来加载不同的配置文件

    在开发过程之中,经常需要在开发和测试环境中进行互相切换,当切换的同时需要加载相应的配置文件,因此要经常 性的对配置文件进行相应的修改,长此以往感到十分痛苦.如果能针对开发和测试环境分别建两个不同的配置 ...

  10. flutter android沉浸式状态栏

    import 'package:flutter/services.dart'; import 'dart:io'; class _MyAppState extends State<MyApp&g ...