gpt4 book ai didi

c++ - 是否缓存了 boost multi_index 提取的键?

转载 作者:可可西里 更新时间:2023-11-01 18:27:39 28 4
gpt4 key购买 nike

我正在使用 boost::multi_index 和我想根据其大小建立索引的数据类型。但是,此数据类型的 size() 成员函数执行起来开销很大。 multi_index 是否缓存从其键提取器中获取的值?

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

最佳答案

好吧,成员函数索引器的文档说他们调用引用的成员函数: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

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

关于c++ - 是否缓存了 boost multi_index 提取的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5256066/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com