使用boost::multi_index高速构建排行榜

前几天在boost的maillist上看到boost::multi_index将要支持ranked_index(邮件内容见附件2),这实乃我等苦逼写排行榜的人的福音。大家再也不用去分析rank_tree里的内容了,故拿出来和大家一起分享。

ranked_index其内部实现和rank_tree是一样的。但其优点是集成在multi_index内部,使用上很方便,而且支持ranked_unique和ranked_non_unique两种索引。

话不多说,首先从http://tinyurl.com/kemwk8q下载下来multi_index的库文件,然后替换boost_1.58中的multi_index,有一个文件夹boost/multi_index和两个文件boost/multi_index_container.hpp,
boost/multi_index_container_fwd.hpp须要替换,替换之后,我们就能够把附件1里的代码拷贝到vs2008里执行啦,输出结果为:

245044518

1

0

了解过rank_tree组件的同学肯定知道是怎么回事了,ranked_index和rank_tree一样比普通的map多了两个函数。其相应关系是:

ranked_index

rank_tree

说明

nth

find_by_rank

名次到迭代器

rank

rank

迭代器到名次

附件1:

// test_rank.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <boost/multi_index_container.hpp>

#include <boost/multi_index/member.hpp>

#include <boost/multi_index/indexed_by.hpp>

#include <boost/multi_index/ranked_index.hpp>

#include <boost/multi_index/ordered_index.hpp>

#include <iostream>

namespace bmi = boost::multi_index;

typedef unsigned int uint32_t;

typedef int int32_t;

struct Data

{

int32_t key;

uint32_t uin;

};

struct tag_key{};

struct tag_uin{};

typedef boost::multi_index_container<

Data, bmi::indexed_by<

bmi::ranked_non_unique<

bmi::tag<tag_key>,

bmi::member<Data, int32_t, &Data::key>

>,

bmi::ordered_unique<

bmi::tag<tag_uin>,

bmi::member<Data, uint32_t, &Data::uin>

>

>

> container_t;

typedef container_t::index<tag_key>::type key_index_t;

typedef container_t::index<tag_uin>::type uin_index_t;

int _tmain(int argc, _TCHAR* argv[])

{

container_t c;

Data data;

data.key = 200;

data.uin = 245044518;

c.insert(data);

data.key = 100;

data.uin = 503063727;

c.insert(data);

key_index_t& key_index = boost::get<tag_key>(c);

uin_index_t& uin_index = boost::get<tag_uin>(c);

std::cout << key_index.nth(1)->uin << std::endl;

std::cout << key_index.rank(key_index.nth(1))
<< std::endl;

std::cout << key_index.rank(bmi::project<tag_key>(c, uin_index.find(503063727)))
<< std::endl;

return 0;

}

附件2:

Message: 2

Date: Wed, 22 Apr 2015 19:34:04 +0000 (UTC)

From: Joaquin M Lopez Munoz <joaquin@tid.es>

To: boost-users@lists.boost.org

Subject: [Boost-users] [multi_index] Announcing preview of ranked

indices

Message-ID: <loom.20150422T212903-565@post.gmane.org>

Content-Type: text/plain; charset=utf-8

Hi,

It's been 11 years since first proposed, but here it is at last. I'm

releasing a prereview of ranked indices for Boost.MultiIndex:

struct person

{

int         age;

std::string name;

};

typedef multi_index_container<

person,

indexed_by<

ranked_non_unique<member<person,int,&person::age> >,

ordered_non_unique<member<person,std::string,&person::name>>>>

multi_t;

multi_t m={{40,"Joe"},{25,"Jill"},{30,"Kurt"},{32,"Sue"}};

auto it=m.emplace(31,"Maggie").first;

std::cout<<m.rank(it)<<" persons younger than "<<it->name<<"\n";

auto n=m.size()/2;

std::cout<<n<<" persons are less than "<<m.nth(n)->age<<" years old\n";

Ranked indices add a bunch of extra rank-related capabilities to the

interface of ordered indices. The rank of an element is its numerical

position in the index. nth(i) returns an iterator to the element with

rank i, whereas rank(it) is the inverse operation. Both execute in

log(n) time.

Additionally, the member functions

find_rank

lower_bound_rank

upper_bound_rank

equal_range_rank

range_rank

behave as their "_rank"-less counterparts except they return ranks rather

than iterators.

One drawback of ranked indices wrt ordered indices (other than their

slower perfomance and higher memory consumption) is that deletion of

elements is log(n) (in ordered indices it is constant time).

Download lib preview: http://tinyurl.com/kemwk8q

Tutorial: http://tinyurl.com/q36c9f7

Reference: http://tinyurl.com/pvoulgr

For people interested in this, I'd appreciate if you could download the

source, copy it on top of Boost 1.58 (1.57 should work as well), play a bit

with the new feature and report your results. Also, opinions on naming

are welcome. Target version for releasing is Boost 1.59, so we have

plenty of time to discuss the design before it is final.

Thank you,

Joaqu?n M L?

pez Mu?oz

Telef?

nica

------------------------------

使用boost::multi_index高速构建排行榜的更多相关文章

  1. boost::multi_index 提供一种千人在线即时排行榜的设计思路

    原文地址: http://www.limerence2017.com/2019/06/23/cpp01/ 做游戏或金融后台开发,经常会遇到设计开发排行榜的需求.比如玩家的充值排行,战力排行等等.而这种 ...

  2. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  3. boost multi_index

    /** boost 多索引容器的一般使用 这里使用google 的gmock 库来验证对boost 多索引模板的使用,并验证. 这里是手敲的,可能会有一些字符敲错的情况,编译错误的放,修改一下,同时链 ...

  4. JavaScript面向对象编程(9)高速构建继承关系之整合原型链

    前面我们铺垫了非常多细节.是为了让大家更加明晰prototype的使用细节: 如今能够将前面的知识整合起来,写一个函数用于高速构建基于原型链的继承关系了: function extend(Child, ...

  5. 用 boost::multi_index 管理玩家

    用 boost::multi_index 管理玩家(金庆的专栏)网游服务器上的玩家集合需要多种索引:如用ID查找,角色名查找, 用登录时分配的会话ID查找.用boost::multi_index进行玩 ...

  6. Yii2高速构建RESTful Web服务功能简单介绍

    Yii2相比Yii1而言,一个重大的改进是内置了功能完备的RESTful支持. 其内置RESTful支持提供了例如以下功能: 使用ActiveRecord的通用接口来高速构建原型: 应答格式协商(缺省 ...

  7. boost::multi_index 多索引容器

    #include "stdafx.h" #include <string> #include <boost/multi_index_container.hpp&g ...

  8. boost multi_index 插入返回值

    boost multi_index 对象插入函数emplace() 的返回值,是一个std::pair<iterator, bool>该pair 的first 是一个插入成功的位置,第二个 ...

  9. boost multi_index简单了解

    #include <string> #include <iostream> #include <boost/multi_index_container.hpp> # ...

随机推荐

  1. [html5] 初识绘图canvas

    这个星期被调到别的项目组专门做了一会儿前端,没办法,人太少,我也只能硬着头皮上... 说起来,html5的canvas真的好用,可以画色块,可以嵌入图片,可以通过定位在图片上写字等等 举例如下 在ht ...

  2. [转载] kill命令

    转载自http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html Linux中的kill命令用来终止指定的进程(terminate a p ...

  3. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

  4. Linux系列教程(二十四)——Linux的系统管理

    上篇博客介绍了Linux的服务管理,不管是以RPM包安装的服务,还是通过源码包安装的服务,万能启动服务的方法都可以通过 /绝对路径/启动脚本名 start .而通过 RPM 包安装的服务还可以通过 s ...

  5. 深入理解Java内置锁和显式锁

    synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...

  6. 浅析php命名空间

    介绍 印象中只有java代码才会用到一大堆的import,当初看到后一脸懵逼并对php心生自豪:还是我大php牛逼够简洁,殊不知php也有命名空间这一说,这些年用的越来越多.那么,为什么要搞那么麻烦呢 ...

  7. Python带参数的装饰器

    在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passi ...

  8. Javascript CustomEvent

    Javascript CustomEvent 原文链接 https://davidwalsh.name/customevent,看到一篇介绍自定义事件的文章 翻译一下,不足之处,还请指正. 自浏览器诞 ...

  9. jquery 动态创建的元素,绑定事件无效之解决方法

    今天遇到一个问题,动态创建的元素,绑定事件无效,如下: js 代码如下: var OaddX = $('.detright div.duibi div.duibox ul li span'); // ...

  10. 用python批量修改文件名

    从youtube上当下来百来首mv,每个都需要去掉视频,这还挺好弄得,格式工厂一弄就完了,但是文件名,都带有乱七八糟的*啥的巴拉巴拉的,咋修改啊,几百首总不可能一个一个rename吧 #批量修改文件名 ...