C++STL库的set就是一个二叉查找树,并且支持结构体。

在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较。

set经常会用到迭代器,这里说明一下迭代器:可以类似的把它看成是一个“下标”,它是指向set集合中的某个元素的指针,它用来遍历这个集合。

头文件

#include<set>

#include<iterator> //set 经常会使用到迭代器,因此需要迭代器的头文件

定义二叉查找树:

set<数据类型> 名称:

multiset<数据类型> 名称; //multiset 是可重集合,set是不可重集合。

定义迭代器:

set<数据类型>::iterator 名称;

multiset<数据类型>::iterator 名称;

一些常用的操作:

插入一个元素v:

S.insert(v); //S是定义过的集合,下面相同

集合的大小:

S.size();

集合为空吗:

S.empty();

集合中最小的元素:

S.begin(); //这是一个指向那个位置的指针,若要值则要在前面加上*

*S.begin(); //前面加*就是那个位置的值

集合中最大的元素:

S.end();  //解释同上

*S.end();

集合中>=v的第一个元素:

it=S.lower_bound(v) //it是定义过的迭代器,注意集合不为空

集合中>v的第一个元素:

it=S.upper_bound(v)//要注意存在这样的>v的数,否则会溢出

迭代器操作:(a,b是定义过的迭代器)

a=b;   //赋值操作

a++;  //增加一位,即指向比这个元素a大一点点的那个元素

a--;    //减少一位,即指向比这个元素a小一点点的那个元素

删除迭代器it指向的那个元素:

S.erase(it);

删除数字为v的那个元素(注意用在multiset时会删除所有v的元素):

S.erase(v);

从小到大输出所有集合中的元素:

copy(S.begin(),S.end(),ostream_iterator<数据类型>(cout," "));

以上就是一些常用的指令,下面看一道模板题。

题目: codevs 1285 宠物收养所

链接:http://codevs.cn/problem/1285/

个人觉得这道题的算法还是很巧妙的。

题目中说:同一时间呆在收养所中的,要么全是宠物,要么全是领养者。这就意味着不可能有人和宠物同时存在的情况,也就是有一个宠物那一个人必须领走。如果宠物少,那么就只能等在那里,等宠物来了。其实这道题中人领养宠物和宠物领养人是等价的,因此,在宠物集合为空的时候,把人当成宠物放进集合(二叉查找树)里面,就可以解决了。

还有一个小技巧,为了避免访问lower_bound的时候越界,可以在刚开始的时候加入正无穷和负无穷(一个允许的很大的值)两个边界,在结算的时候判断一下就可以了。还有要注意这个时候的集合为空的判断是S.size()==2。

附代码:

 #include<cstdio>
#include<iostream>
#include<set>
#include<iterator>
using namespace std;
const int maxn=;
const int INF=(<<);
const int MOD=; int n,ans,sert;
set<int> S;
set<int>::iterator lt,rt; int main()
{
cin>>n;
S.insert(INF),S.insert(-INF);
for(int i=,x,y;i<=n;i++)
{
cin>>x>>y;
if(==S.size()) sert=x,S.insert(y);
else if(x==sert) S.insert(y);
else
{
rt=S.lower_bound(y);
lt=rt,lt--;
if(y-*lt<=*rt-y && *lt!=-INF) ans=(y-*lt+ans)%MOD,S.erase(lt);
else ans=(*rt-y+ans)%MOD,S.erase(rt);
}
}
cout<<ans<<endl;
return ;
}

codevs 1285 二叉查找树STL基本用法的更多相关文章

  1. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  2. STL set 用法

      c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. ...

  3. STL map 用法

    首先make_pair Pairs C++标准程序库中凡是"必须返回两个值"的函数, 也都会利用pair对象  class pair可以将两个值视为一个单元.容器类别map和mul ...

  4. STL:map用法总结

    一:介绍 map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能.命名空间为std,所属头文件<map> 二:常用操 ...

  5. 记一些stl的用法(持续更新)

    有些stl不常用真的会忘qwq,不如在这里记下来,以后常来看看 C++中substr函数的用法 #include<string> #include<iostream> usin ...

  6. 日常笔记6C++标准模板库(STL)用法介绍实例

    一.vector常见用法详解 vector翻译为向量,但是这里翻译成变长数组的叫法更好理解. 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11 ...

  7. c++ STL map 用法

    map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  8. STL vector 用法介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  9. STL --> set用法

    set用法 一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <se ...

随机推荐

  1. Net中的常见的关键字

    Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...

  2. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  3. iOS Interface Builder:在.xib文件中加载另一个.xib文件

    在开发中,经常会用到一个需要重复使用的模块,比如好友列表中每个用户的展示或每条动态,这些都是相同的模版,这样我们就可以把这个部分提取出来放到一个单独的.xib中.那么提取出的.xib如何在其他.xib ...

  4. DataNavigatorButtons

    备注 您可以访问使用该控件的DataNavigator.Buttons属性显示在一个的DataNavigator控制按钮设置.该属性的返回值是一个DataNavigatorButtons对象. 下图说 ...

  5. 十五天精通WCF——第一天 三种Binding让你KO80%的业务

    转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ...

  6. C#实现微信开发前奏

    不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,链接给你   http://mp.weixin.qq.com/debug/cgi ...

  7. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  8. GJM : Unity3D HIAR -【 快速入门 】 三、导入 SDK

    导入 SDK 本文将向您介绍如何在 Unity 工程中导入 HiAR SDK for Unity.在开始之前,请先访问 HiAR 官网下载最新版本的 SDK. 下载 HiAR SDK for Unit ...

  9. PowerDesigner 常用设置

    1.使用 JDBC 方式连接 Oracle 逆向生成数据库 PDM 使用 ODBC 方式连接 Oracle 数据库可以借鉴这位兄弟的博客:http://www.cnblogs.com/clivehua ...

  10. mui 手势事件配置

    在开发中监听双击屏幕事件时不起作用,需要在mui.init方法的gestureConfig参数中设置需要监听的手势事件 手势事件配置: 根据使用频率,mui默认会监听部分手势事件,如点击.滑动事件:为 ...