普通的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相关源码,提供有序属性值的查找接口的更多相关文章

  1. 32.修改IK分词器源码来基于mysql热更新词库

    主要知识点, 修改IK分词器源码来基于mysql热更新词库     一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...

  2. STL空间分配器源码分析(二)mt_allocator

    一.简介 mt allocator 是一种以2的幂次方字节大小为分配单位的空间配置器,支持多线程和单线程.该配置器灵活可调,性能高. 分配器有三个通用组件:一个描述内存池特性的数据,一个包含该池的策略 ...

  3. Volley 图片加载相关源码解析

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...

  4. STL 之 list源码自行实现(iterator)

    (0)文件夹 STL 之 vector源码实现(云算法<< [] = 重载, new delete,throw catch) STLc++中string类的源码 堆(stack) 之 c ...

  5. 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  6. MFC界面相关源码

    这是这4篇MFC界面的相关源码.建议学习Visual C++的看看这2本微软官方出的教材. [MFC Windows程序设计(第2版,修订版)](美)Jeff Prosise著 [Windows程序设 ...

  7. 如何在IDEA里给大数据项目导入该项目的相关源码(博主推荐)(类似eclipse里同一个workspace下单个子项目存在)(图文详解)

    不多说,直接上干货! 如果在一个界面里,可以是单个项目 注意:本文是以gradle项目的方式来做的! 如何在IDEA里正确导入从Github上下载的Gradle项目(含相关源码)(博主推荐)(图文详解 ...

  8. es 修改拼音分词器源码实现汉字/拼音/简拼混合搜索时同音字不匹配

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会用到拼音匹配查询,大家都会用到拼音分词器,但是拼音分词器匹配的 ...

  9. 修改Java标准库源码

    以下是摘抄,实际操作没有测试   先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Cla ...

随机推荐

  1. Android 4 学习(14):Internet Resources

    参考<Professional Android 4 Development> 使用Internet资源 打开URI String myFeed = getString(R.string.m ...

  2. 提高ListView的效率

    按照普通的写法,如果ListView里面有比较多的东西的话,在加载每一个Item的时候,是非常非常卡的.具体表现就是滚动起来的时候会看见明显的卡顿. 关键还是处理自定义Adapter里面的getVie ...

  3. oracle——存储过程参数

    oracle 存储过程类型: 1.in:输入类型,即由应用程序将数据传入oracle存储过程中:这种参数在存储过程中是只读参数,在存储过程中无法对该类型的参数进行修改: 2.out:输出参数,是在存储 ...

  4. leetcode693

    class Solution { public: bool hasAlternatingBits(int n) { ; while (n) { ; ) { last = x; } else { if ...

  5. BurpSuite系列(九)----Comparer模块(比较器)

    一.简介 Burp Comparer在Burp Suite中主要提供一个可视化的差异比对功能,来对比分析两次数据之间的区别.使用中的场景可能是: 1.枚举用户名过程中,对比分析登陆成功和失败时,服务器 ...

  6. 微信小程序中出现Invoking Page() in async task.问题

    在做项目中需要让页面跳到外网,用到了<web-view src=""> </web-view>组件,需要新建一个文件放这个组件,调接口的时候链接连到这个页面 ...

  7. nginx搭建文件服务器配置文件

    worker_processes 1; events { worker_connections 1024;} http { include mime.types; default_type appli ...

  8. SolrCloud中的文件与Collection管理

    转载请出自出处:http://eksliang.iteye.com/blog/2124078 http://eksliang.iteye.com/ 一.内嵌启动SolrCloud时端口默认分配 当 S ...

  9. linux su su -

    本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行, ...

  10. c语言交换两个变量的值

    有两个变量a 和b,想要交换它们的值 int a,b; 能不能这样操作呢? b=a; a=b; 不能啊,这样操作的意思是把a的值放到b中,然后b中的值已经被覆盖掉了,已经不是b原来的那个值了,所以是没 ...