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源码之心得的更多相关文章

  1. Spring源码分析心得-Bean的读取和注册

    Spring广泛的被使用足以证明它的价值,成功的东西自然值得我们深入学习.有很多人说的熟悉Spring也只是简单的使用经验,当我发现我也是其中一员时我很恐惧,所以开始扒源码,准备深入了解,话不多说,直 ...

  2. 干货:Android 源码使用心得分享

          我相信很多初学者会和我一样经常在网上去找Android开发源码,但是往往因为运行不起来非常的懊恼!在做爱开发网站的时候,收集App代码时就遇到了这种困难,我相信网络上面的源码大部分在发布前 ...

  3. ThinkPhp 源码阅读心得

    php 中header 函数 我可能见多了,只要用来跳转.今天在阅读TP源码的时候发现,header函数有第三个参数.有些困惑所以找到手册查阅下,发现 void header ( string $st ...

  4. breeze源码阅读心得

            在阅读Spark ML源码的过程中,发现很多机器学习中的优化问题,都是直接调用breeze库解决的,因此拿来breeze源码想一探究竟.整体来看,breeze是一个用scala实现的基 ...

  5. mybatis源码阅读心得

    第一天阅读源码及创建时序图.(第一次用prosson画时序图,挺丑..) 1.  调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法: 2.   ...

  6. 读EntityFramework.DynamicFilters源码_心得_设计思想_04

    前几次,我们从说明文档,示例,单元测试了解了怎么用这个动态过滤器,那么如果仅仅是为了实现目的,知道怎么用就可以完成相应的功能开发,但我还想了解的问题是 作者是怎么将动态过滤器与EF结合的 有哪些设计思 ...

  7. 读EntityFramework.DynamicFilters源码_心得_整体了解01

    前两天同事发给我一个连接地址:实体框架高级应用之动态过滤 EntityFramework DynamicFilters为什么会找到动态过滤的内容,是源于前段时间,我们想做一个个人blog 后端用.NE ...

  8. spring security源码分析心得

    看了半天的文档及源码,终于理出了spring-security的一些总体思路,spring security主要分认证(authentication)和授权(authority). 1.认证authe ...

  9. VUE源码解析心得

    解读vue源码比较好奇的几个点: VUE MVVM 原理 http://www.cnblogs.com/guwei4037/p/5591183.html https://cn.vuejs.org/v2 ...

随机推荐

  1. DataSet.WriteXml()

    枚举通常是作为 DataSet.WriteXml() 方法的第二个参数使用.它决定使用哪种格式保存XML: IgnoreSchema --默认值.只写数据集的数据,不带有任何架构信息.如果数据集内无数 ...

  2. hzau 1204 Escape from the Darkness

    1204: Escape from the Darkness Time Limit: 1 Sec  Memory Limit: 1280 MBSubmit: 93  Solved: 3[Submit] ...

  3. 关于nginx做代理,uwsgi gunicorn等服务器做后端时

    (1) 响应数据过大 被截断的问题 通常看buffers参数的设置(缓冲从后端服务器的应答) uwsgi的参数是 uwsgi_buffers 4 128k gunicorn 设置代理参数 proxy_ ...

  4. UVA - 1218 Perfect Service (树形dp)(inf相加溢出)

    题目链接 题意:给你一个树形图,让你把其中若干个结点染成黑色,其余的染成白色,使得任意一个白色结点都恰好与一个黑色结点相邻. 解法比较容易,和树上的最大独立集类似,取一个结点作为树根,对每个结点分三种 ...

  5. asp.net core mcroservices 架构之 分布式日志(二)之自定义日志开发

    netcore日志原理 netcore的日志是作为一个扩展库存在的,每个组件都有它的入口,那么作为研究这个组件的入口是最好的,首先看两种方式: 这个是源码例子提供的. var loggingConfi ...

  6. 重温CLR(一)CLR基础

    如果一个C#developer,对CLR没有了解,那就只能是入门级别.未来.NET CORE是趋势,但是.NET CORE 也是基于CoreCLR的,而CLR和CoreCLR其实差别不大,从runti ...

  7. BZOJ3075,LG3082 [USACO13MAR]项链Necklace

    题意 Bessie the cow has arranged a string of N rocks, each containing a single letter of the alphabet, ...

  8. 2017.10.4北京清北综合强化班DAY4

    财富(treasure) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以 ...

  9. keepalived之 ipvsadm-1.26-4(lvs)+ keepalived-1.2.24 安装

    一.安装 LVS 前提:已经提前配置好本地 Yum 源 配置过程可参考> http://blog.csdn.net/zhang123456456/article/details/56690945 ...

  10. CUDA Pro Tip: Optimized Filtering with Warp-Aggregated Atomics

    In this post, I’ll introduce warp-aggregated atomics, a useful technique to improve performance when ...