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. 网易android开发面试题及心得

    前几天面试网易android开发,总体感觉问题难度一般.怪我自己没有好好梳理知识,尤其是基础,后面就没消息了... 笔试: 1.描述Activity 生命周期 2.什么是ANR,如何规避? 3.描述a ...

  2. idea docker 连接 linux 上的 docker

    安装插件 Docker插件,首先需要在你的IDEA中安装Docker插件,定位到File-Setting-Plugins后搜索Docker Integration安装 配置Docker服务器,在IDE ...

  3. dlmalloc(一)【转】

    转自:http://blog.csdn.net/ycnian/article/details/12971863 我们写过很多C程序了,经常会分配内存.记得刚学C语言时老师说过,可以向两个地方申请内存: ...

  4. ahttp

    # -*- coding: utf-8 -*- # @Time : 2018/8/20 14:35 # @Author : cxa # @File : chttp.py # @Software: Py ...

  5. 34.Find First and Last Position of Element in Sorted Array---头条面试题、《剑指offer》38

    题目链接 题目大意:找出一串升序数组中target值的起始下标和结束下标值,如果不存在则返回{-1,-1}. 解法一:用二分查找,找到数组中的target,然后找其左边和右边的target下标值.代码 ...

  6. 84.Largest Rectangle in histogram---stack

    题目链接:https://leetcode.com/problems/largest-rectangle-in-histogram/description/ 题目大意:在直方图中找出最大的矩形面积.例 ...

  7. [写出来才有价值系列:node.js]node.js 01-介绍及安装

    对于Node.js在百度百科上是这样解释的: Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度 ...

  8. SVN文件上感叹号、加号、问号等图标的原因

    黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...

  9. Hilite代码高亮工具

    在用<有道云笔记>等软件时候,软件自身不提供代码高亮功能,对于需要记录code的学习笔记,视觉效果丢失. 有很多在线工具能用来代码高亮,比如oschina就有代码高亮页面用于着色. 但是我 ...

  10. logstash参数配置

    input配置: file:读取文件 input { file{ path => ["/var/log/*.log","/var/log/message" ...