boost multi_index 提取的键是不是被缓存?

Posted

技术标签:

【中文标题】boost multi_index 提取的键是不是被缓存?【英文标题】:Are boost multi_index extracted keys cached?boost multi_index 提取的键是否被缓存? 【发布时间】:2011-03-10 06:02:15 【问题描述】:

我正在使用 boost::multi_index 的数据类型,我想根据它的大小进行索引。但是,这种数据类型的 size() 成员函数执行起来很昂贵。 multi_index 是否缓存它从其键提取器中获取的值?

例如,如果我使用成员函数键 (element.size()) 创建了一个带有有序索引的 multi_index 容器,并插入了一个其大小位于容器中间某处的元素,该容器是否会重新-对它访问的所有元素调用 size() 成员函数,同时在找到正确的插入点之前遍历其内部数据结构?

【问题讨论】:

您可能想自己缓存它。你需要在你的对象中添加一个size_t,也许还有一个“脏”位,这样你就知道你是否缓存了它以及缓存是否是最新的。 【参考方案1】:

好吧,成员函数索引器的文档说他们调用引用的成员函数:http://www.boost.org/doc/libs/1_46_0/libs/multi_index/doc/reference/key_extraction.html#key_extractors

但如有疑问,请提供个人资料:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/indexed_by.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

namespace bmi = boost::multi_index;

int g_calls = 0;
struct A

  explicit A(int sz) : m_size(sz)  
  int size() const  ++g_calls; return m_size; 
private:
  int m_size;
;

typedef boost::multi_index_container<
  A*,
  bmi::indexed_by<
    bmi::ordered_non_unique<
      BOOST_MULTI_INDEX_CONST_MEM_FUN(A,int,A::size)
    >
  >
> container_t;

int main()

  container_t cont;
  int n = 100;
  vector<int> o(2*n+1);
  for( int i = 0; i != 2*n+1; ++i )
    o[i] = i;
  random_shuffle(o.begin(), o.end());

  for( int i = 0; i != n; ++i )
    cont.insert(new A(o[i]));
  cout << "Calls to A::size(): "<< g_calls << endl;
  for( int i = n+1; i <= 2*n; ++i )
    cont.insert(new A(o[i]));
  cout << "Calls to A::size(): "<< g_calls << endl;
  cont.insert(new A(o[n]));
  cout << "Calls to A::size(): "<< g_calls << endl;
  for( int i = 0; i != o.size(); ++i )
    cont.find(o[i]);
  cout << "Calls after calling find " << o.size() << " times: "<< g_calls << endl;
  return 0;

给出以下输出(使用 Boost 1.46):

Calls to A::size(): 629
Calls to A::size(): 1465
Calls to A::size(): 1474
Calls after calling find 201 times: 3262

所以,答案似乎是不,它不缓存值

【讨论】:

太棒了,谢谢。这太糟糕了。我想我得把我的类型换行了。

以上是关于boost multi_index 提取的键是不是被缓存?的主要内容,如果未能解决你的问题,请参考以下文章

多索引表 boost::multi_index多索引容器

在模板结构中使用 boost multi_index

通过 size_t 索引迭代到 boost::multi_index 中的顺序位置?

从 boost multi_index 数组中移动元素

提升 multi_index 获取依赖类型

Boost.MultiIndex 模板替换失败?