修改stl::set相关源码,提供有序属性值的查找接口
普通的stl::set,查找时只能传入key_type。 不能使用属性值查找。
例如:
/* an employee record holds its ID, name and age */
class employee
{
public:
int id;
std::string name;
int age;
public:
employee():id(){}
employee(int id_,std::string name_,int age_):id(id_),name(name_),age(age_){}
employee(const employee& e2)
{
*this = e2;
} friend std::ostream& operator<<(std::ostream& os,const employee& e)
{
os<<e.id<<" "<<e.name<<" "<<e.age<<std::endl;
return os;
}
bool operator<(const employee& e2) const
{
return this->id < e2.id;
} employee& operator=(const employee& e2)
{
id = e2.id;
name = e2.name;
age = e2.age;
return *this;
} }; stl::set<employee> set1; set1.insert(employee(,"Aristotle",));
set1.insert(employee(,"Albert",));
set1.insert(employee(,"John",)); set1::iterator it;
it = set1.find(employee(,"Albert",)); //find参数必须是employee对象,不能只提供id进行查找
可以自定义一个带模板的find函数。stl是开源的,可以自己拿出相关代码进行改动,不使用编译库自带的。
在stl_set.h中原来的find()函数相同的位置 添加带模板的find函数。
//针对属性值的查找接口,需要自定义比较函数。只能在set的当前索引下有序的属性查找,即_T必须是set中有序的属性。stl的find接口只能接受key_type对象作为参数
template<class _T, class _T_Compare>
const_iterator
find(const _T& __x, _T_Compare com)
{ return _M_t.find(__x, com); }
在stl_rdtree.h中find()函数相同的位置 添加带模板的find函数,来提供上层set需要调用的接口。
//提供针对属性值的lower_bound接口,使用template
template<class _T, class _T_Compare>
iterator
lower_bound(const _T& __k, _T_Compare com)
{ return _M_lower_bound(_M_begin(), _M_end(), __k, com); } //提供针对属性值的查找接口,使用template
template<class _T, class _T_Compare>
const_iterator
find(const _T& __k, _T_Compare com)
{
const_iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k, com);
return (__j == end()
|| com(__k,
_S_key(__j._M_node))) ? end() : __j;
}
这样就可以使用
set1::iterator it = set1.find(3); //查找id为3的对象
修改stl::set相关源码,提供有序属性值的查找接口的更多相关文章
- 32.修改IK分词器源码来基于mysql热更新词库
主要知识点, 修改IK分词器源码来基于mysql热更新词库 一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...
- STL空间分配器源码分析(二)mt_allocator
一.简介 mt allocator 是一种以2的幂次方字节大小为分配单位的空间配置器,支持多线程和单线程.该配置器灵活可调,性能高. 分配器有三个通用组件:一个描述内存池特性的数据,一个包含该池的策略 ...
- Volley 图片加载相关源码解析
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...
- STL 之 list源码自行实现(iterator)
(0)文件夹 STL 之 vector源码实现(云算法<< [] = 重载, new delete,throw catch) STLc++中string类的源码 堆(stack) 之 c ...
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- MFC界面相关源码
这是这4篇MFC界面的相关源码.建议学习Visual C++的看看这2本微软官方出的教材. [MFC Windows程序设计(第2版,修订版)](美)Jeff Prosise著 [Windows程序设 ...
- 如何在IDEA里给大数据项目导入该项目的相关源码(博主推荐)(类似eclipse里同一个workspace下单个子项目存在)(图文详解)
不多说,直接上干货! 如果在一个界面里,可以是单个项目 注意:本文是以gradle项目的方式来做的! 如何在IDEA里正确导入从Github上下载的Gradle项目(含相关源码)(博主推荐)(图文详解 ...
- es 修改拼音分词器源码实现汉字/拼音/简拼混合搜索时同音字不匹配
[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会用到拼音匹配查询,大家都会用到拼音分词器,但是拼音分词器匹配的 ...
- 修改Java标准库源码
以下是摘抄,实际操作没有测试 先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Cla ...
随机推荐
- hadoop中unhealthynodes的问题解决
在yarn-site.xml中加入如下配置 <property> <name>yarn.nodemanager.disk-health-checker.min-heal ...
- C# 泛型类型参数的约束
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上 ...
- c# 程序调用cmd执行命令如SVN.exe
c# 程序调用cmd执行命令如SVN.exe string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Di ...
- bash shell笔记1 脚本基础知识
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/505644 * ...
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3303 Solved: 1129[Submit][S ...
- ubuntu 设置虚拟机和主机在同一网段
一.在VMware中将网络连接方式设置为桥接 1.打开VM菜单栏->Settings 2.在弹出的Virtual Machine Setting对话框中点击Network Adapter,在右边 ...
- Luogu 4438 [HNOI/AHOI2018]道路
$dp$. 这道题最关键的是这句话: 跳出思维局限大胆设状态,设$f_{x, i, j}$表示从$x$到根要经过$i$条公路,$j$条铁路的代价,那么对于一个叶子结点,有$f_{x, i, j} = ...
- Luogu 3261 [JLOI2015]城池攻占
BZOJ 4003 需要实现一个可并堆. 每个点维护一个小根堆,然后一开始把所有骑士加入到它所在的点的小根堆当中,实际上空间是$O(m)$的,然后我们从上到下不断合并这个小根堆,合并完之后如果遇到堆顶 ...
- 十四课 slam&gmapping
gmapping 根据激光数据(或者深度数据模拟的激光数据)建立地图,在turtlebot里面应用的就是深度数据模拟的激光数据.如果没有激光雷达的话可以使用Kinect. SLAM 机器人在未知环境中 ...
- HttpRuntime.Cache
a.在Web开发中,我们经常能够使用到缓存对象(Cache),在ASP.NET中提供了两种缓存对象,HttpContext.Current.Cache和HttpRuntime.Cache,那么他们有什 ...