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. VS2013打包安装(InstallShield Limited Edition for Visual Studio 2013 )

    (1)百度文库安装步骤: http://wenku.baidu.com/link?url=B7NIE3gmoVx7UYUKigVGMjmINFIThpkH0DLXcYGx_9B1YzrX1QfHO2N ...

  2. JAX-RS介绍——Java API forRESTful WebServices,JAX-RS的目标是Web Services开发(这与HTML Web应用不同)而Spring MVC的目标则是Web应用开发

    JAX-RS Java API forRESTful WebServices旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架.是一个J ...

  3. dilworth定理的通俗讲解

    度娘定义:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度.其名称取自数学家Robert P. Dilworth. 反链是一种偏序集,其任意两 ...

  4. php实现word在线浏览功能。

    http://laoniangke.com/php/2012/10/08/php-doc-webview.html

  5. myeclipse2014中如何安装freeMarker插件(支持ftl语法高亮)

    MyEcplise2014安装Freemarker插件(支持.ftl文件) 1.下载插件:http://sourceforge.net/projects/freemarker-ide/?source= ...

  6. RabbitMQ用户角色及权限控制(不错)

    ########################用户角色####################### RabbitMQ的用户角色分类:none.management.policymaker.moni ...

  7. 2.Linux下安装Jenkins

    1.安装jenkins的前提是安装好jdk环境,自行安装jdk,若安装成功后,使用一下命令即可成功安装jenkins: wget -O /etc/yum.repos.d/jenkins.repo ht ...

  8. compile cef2526

    fetch --nohooks chromium cd /path/to/chromium/src# git checkout -b 51.0.2704.103 refs/tags/51.0.2704 ...

  9. CS231n笔记列表

    课程基础1:Numpy Tutorial 课程基础2:Scipy Matplotlib 1.1 图像分类和Nearest Neighbor分类器 1.2 k-Nearest Neighbor分类器 1 ...

  10. ASP.NET网站性能提升的几个方法

    1. HTTP 压缩 HTTP 压缩通常用于压缩从服务端返回的页面内容.它压缩HTTP请求和响应,这个会是巨大的性能提升.我的项目是基于Window Server 2003开发的,可以参考这篇文章. ...