修改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 ...
随机推荐
- Windows 环境下Java调用CRF++详解
1.步骤一览 2.步骤详情 2.1.环境准备 Swig(Simplified Wrapper and Interface Generator)下载,Windows操作系统直接解压即可使用 CRF++( ...
- 并发模型(一)——Future模式
多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion.不变.生产者-消费者 模式: jdk除了定义了若干并发 ...
- 自定义inputformat和outputformat
1. 自定义inputFormat 1.1 需求 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案 1.2 分析 小文件的优 ...
- SqlServer——for xml path
for xml path 就是将 sql 查询出来的内容以XML的格式显示出来.参考网站MSDN:将 PATH 模式与 FOR XML 一起使用. 先创建测试用的表格: create table SZ ...
- Emgu学习之(一)----Emgu简介
OpenCV OpenCV是一个开源的跨平台的计算机视觉库,它的设计目标时执行速度尽量快,主要关注实时应用.可以运行在Linux.Windows.Mac OS.Android.IOS.Maemo.Fr ...
- 【283】ArcMap 中河流字体设置
左斜字体的设置 1. 右键属性设置如下,将字体角度如下设置,并点击改变样式的按钮 2. 首先设置颜色如下,然后设置加粗斜体,最后勾选 CJK character orientation 的复选框 C ...
- phpmailer邮件类
<?php/** * 邮件类 * Enter description here ... * @author df * Mail::getMail()->sendMail(); * */cl ...
- Centos手动编译安装vim8
系统:CentOs6.9 gcc版本:5.1.0 github上拉取vim工程之后,cd src,执行一下命令: $ ./configure $ sudo make gcc -c -I. -Iprot ...
- mfs权威指南
1. 我在性能测试中间遇到些问题,因为我时间有限,所以希望大家一起来测试解决,群策群力.有什么问题请大家及时指出来,因为我也处在一个不断摸索的阶段. 2. mfs不多做介绍,具体细节请参考本版mfs实 ...
- 如何在局域网架设FTP(特别简单方便)
https://files.cnblogs.com/files/wlphp/FTPserver.zip 在我上传的博客园文件下载下来 启动服务,设置账号密码(注意一定要关闭防火墙)