UDN-企业互联网技术人气社区

板块导航

浏览  : 1235
回复  : 0

[资源分享] 只需两分钟,带你玩转关联容器之比较算法

[复制链接]
呵呵燕的头像 楼主
发表于 2016-9-8 21:30:45 | 显示全部楼层 |阅读模式
  STL的容器中一般把set、multiset、map、multimap等叫做关联容器,关联容器是通过键(key)插入和查找元素的,键的比较算法是模板参数(仿函数)。

  缺省比较算法是less,也可以自行定义,如:

c.png


  这个比较算法是编译时确定的,若有多种数据结构,那只能为每种结构定义set。若想在运行时才确定比较算法,这种做法无法实现。那么能不能定义好set之后在运行期改变仿函数中调用的比较函数呢?

  STL中关联容器有一个key_comp的方法:key_compare key_comp() const;

  但其返回的是容器中比较对象变量的一份拷贝,而不是容器中比较对象变量本身,无法修改。

  而微软VC++自带的STL实现中,有_Getcomp方法可以获取到比较对象变量的引用:key_compare& _Getcomp();

  那么,用VC++时我们可以采用如下方法来实现运行期改变比较算法:

b.png
a.png


  可是_Getcomp是微软扩展的,从命名以下划线开头这个惯例也表明了不是标准,那对于标准的STL就没办法了么?

  正常路行不通,我们可以走偏门,直接访问关联容器内存地址,找到这个比较函数指针。

  对于特定的关联容器,这个比较函数的偏移量是确定的。更通用一些的方法,是先给比较函数赋一个特殊值,然后寻找这个特殊值就是了。

  当然特殊值不要用0之类的,这样容易跟其他成员变量一样。考虑到成员变量是对齐的,那么最终可以这样:

9.png
8.png


  现在,这个技能你GET到了么?

原文作者: 何仲君  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部