set源码之心得
C++的STL很强大,强大到我只愿慵懒地去使用而不知其所以然。直到李师问我,我的回答被李师否定,我方才意识到自己是多么地浅陋。希望自己有空抽时间把STL源码给研究一下,化为自己真正可以掌控的力量。
set容器的原型:template <class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) >。
在默认情况下,set容器使用less<key>进行比较。而我关心的就是这个less。平时我们会自定义一个比较函数来覆盖less(这里给个set基本用法的链接:http://www.cnblogs.com/jiu0821/p/4190026.html),里面往往是返回一个比较语句。传进去之后,set容器是怎么工作的呢?看过源码的coder会发现,工作原理极为简单:eg:
operator @;//传入的比较符号
type A, B;
if (A @ B) ...;
else if (B @ A) ...;
else ...
//得到A与B的“大小”关系
当下有这样一个需求:现有一个数据库,里面记录了若干IP段(即某个范围内所有IP)和IP点(某个IP),现一个用户发来请求报文,我们需要判断该用户的IP是否在数据库中已记录。简化一下,这里的IP简化为一个正整数,大小不超过100。编码实现这个需求的解决方案。
思路:由于存在段和点,我们统一处理为段,即点转化为两端点相同的段,如此,我们求用户IP段与现有集合IP段是否有交集即可。设段为[t1,t2],则利用set容器
if (a.t2 < b.t1) ...;
else if (b.t2 < a.t1) ...;
else ...;
即为所求。
代码:
#include <iostream>
#include <set>
using namespace std; struct info
{
int t1, t2;
bool operator < (const info &r) const
{
return t2<r.t1;
}
}; set<info> data; void Input ();
bool Search ();
inline void Output (bool); int main ()
{
Input ();
Output (Search ());
return ;
} void Input ()
{
info tmp;
int m, n;
cin >> m;//时间段
for (int i = ; i <= m; i++)
{
cin >> tmp.t1 >> tmp.t2;
data.insert (tmp);
}
cin >> n;//时间点
for (int i = ; i <= n; i++)
{
cin >> tmp.t1;
tmp.t2 = tmp.t1;
data.insert (tmp);
}
}
bool Search ()
{
info tmp;
set<info>::iterator it;
cin >> tmp.t1;
tmp.t2 = tmp.t1;
it = data.find (tmp);
if (it != data.end ())
{
return true;
}
else
{
return false;
}
}
inline void Output (bool tmp)
{
if (tmp)
{
cout << "succeed!"
<< endl;
}
else
{
cout << "failed!"
<< endl;
}
}
set源码之心得的更多相关文章
- Spring源码分析心得-Bean的读取和注册
Spring广泛的被使用足以证明它的价值,成功的东西自然值得我们深入学习.有很多人说的熟悉Spring也只是简单的使用经验,当我发现我也是其中一员时我很恐惧,所以开始扒源码,准备深入了解,话不多说,直 ...
- 干货:Android 源码使用心得分享
我相信很多初学者会和我一样经常在网上去找Android开发源码,但是往往因为运行不起来非常的懊恼!在做爱开发网站的时候,收集App代码时就遇到了这种困难,我相信网络上面的源码大部分在发布前 ...
- ThinkPhp 源码阅读心得
php 中header 函数 我可能见多了,只要用来跳转.今天在阅读TP源码的时候发现,header函数有第三个参数.有些困惑所以找到手册查阅下,发现 void header ( string $st ...
- breeze源码阅读心得
在阅读Spark ML源码的过程中,发现很多机器学习中的优化问题,都是直接调用breeze库解决的,因此拿来breeze源码想一探究竟.整体来看,breeze是一个用scala实现的基 ...
- mybatis源码阅读心得
第一天阅读源码及创建时序图.(第一次用prosson画时序图,挺丑..) 1. 调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法: 2. ...
- 读EntityFramework.DynamicFilters源码_心得_设计思想_04
前几次,我们从说明文档,示例,单元测试了解了怎么用这个动态过滤器,那么如果仅仅是为了实现目的,知道怎么用就可以完成相应的功能开发,但我还想了解的问题是 作者是怎么将动态过滤器与EF结合的 有哪些设计思 ...
- 读EntityFramework.DynamicFilters源码_心得_整体了解01
前两天同事发给我一个连接地址:实体框架高级应用之动态过滤 EntityFramework DynamicFilters为什么会找到动态过滤的内容,是源于前段时间,我们想做一个个人blog 后端用.NE ...
- spring security源码分析心得
看了半天的文档及源码,终于理出了spring-security的一些总体思路,spring security主要分认证(authentication)和授权(authority). 1.认证authe ...
- VUE源码解析心得
解读vue源码比较好奇的几个点: VUE MVVM 原理 http://www.cnblogs.com/guwei4037/p/5591183.html https://cn.vuejs.org/v2 ...
随机推荐
- hdu6237 分解质因子
题意:给一堆石子,每次移动一颗到另一堆,要求最小次数使得,所有石子数gcd>1 题解:枚举所有质因子,然后找次数最小的那一个,统计次数时,我们可以事先记录下每堆石子余质因子 的和,对所有石子取余 ...
- mpv 播放器
https://mpv.io/ Mac版本: 官网: https://mpv.io/ https://mpv.io/installation/ 下载: http://sva.wakku.to/~chr ...
- 【新手专属】IntelliJ IDEA删除项目
这两天刚从Eclipse转手IDEA,每次都是直接删项目文件,后来百度一下才明白原来应该这样~~~ IntelliJ IDEA 删除项目,共三步: 第一步:记住当前项目文件路径1,然后点击file-- ...
- 14 Python 装饰器
装饰器 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数.让我们从简单的开始,直到能写出实用的装饰器. def outer(some_func): def inner(): print ...
- Codeforces Round #271 (Div. 2)D(递推,前缀和)
很简单的递推题.d[n]=d[n-1]+d[n-k] 注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时. 所以用预处理前缀和来解决重复累加问题. 最后一个细节坑了我多次: print ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
- SVN客户端与服务器端搭建
一.客户端安装 1.点击安装程序 2.修改svn安装位置 3.开始安装 4.安装完成 5.回到左面 右键出现svn检出 tortoiSVN 表示安装成功 二.SVN服务端安装 1.点击服务端安装 ...
- mysql笔记1—安装、配置和基础的数据表操作
本篇笔记主要分为两部分: 1,安装完毕之后的简单配置 2,数据的类型.简单的数据表操作命令 一.mysql安装完毕之后 windows和linux环境,除mysql的安装.配置有所不同,其他操作一样, ...
- http请求在asp.net中的请求过程
当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会 ...
- XSS与CSRF攻击
一.XSS Cross Site Script,跨站脚本攻击.是指攻击者在网站上注入恶意客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一 ...