问题标签 [multi-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - boost::multi_index_container::index 的意义何在::类型?
如果您有boost::multi_index_container< >
多个索引,显然有多种方法可以对其进行迭代 - 每个索引都定义了一种方式。例如,如果你有一个带有 tag 的索引,你可以从toT
迭代。container.get<T>().begin()
container.get<T>().end()
如果您尝试在 for 循环中执行此操作(并且没有 C++0x auto
),则迭代器的类型为multi_index_container<...>::index<T>::type::iterator
. 现在index<T>::type
将是 boost::multi_index::detail::ordered_index 或结构上等价的东西。例如,它将提供一个iterator
typedef 和一个begin()
方法。
现在我的问题是,既然multi_index_container< >::index<T>
似乎只存在于 typedefindex<T>::type
并且index<T>::type
有已知的成员,为什么不index<T>
typedef 这些成员?这将允许您编写multi_index_container<...>::index<T>::iterator
.
同样,为什么multi_index_container< >::index_iterator<T>
不是迭代器?multi_index_container< >::index_iterator<T>::type
是的,但是为什么 Boost 选择了嵌入式 typedef 呢?同样,这::type
似乎只会增加混乱。
c++ - boost multi_index 是如何实现的
我很难理解 Boost.MultiIndex 是如何实现的。可以说我有以下内容:
我想我有一个数组,Employee[]
,它实际上存储了employee
对象,还有两张地图
以姓名和年龄为键。每个映射都有employee*
指向数组中存储对象的值。这个可以吗?
c++ - 从 Boost 多索引迭代器获取数字索引
我正在存储一堆以下内容
在 Boost.MultiIndex 容器中,定义为
现在我有两个迭代器,一个 fromindex<by_title>
和一个 from index<by_id>
。在不添加数据成员的情况下,将这些索引转换为容器的随机访问部分的最简单方法是什么struct Article
?
c++ - boost::multi_index 用户定义的键提取器和复合键
为了避免 msvc2010 编译器错误,我在 Composite_key 中使用了用户定义的密钥提取器,如下所示:
这似乎编译得很好(并且 vc 编译器不再崩溃),但是当我尝试调用 equal_range 时我遇到了一些问题:
在我的旧实现中没问题,因为我的composite_key 是由两个const_mem_fun“组成”的。现在,composite_key 的最后一个参数是自定义密钥提取器,我不知道用什么替换 'Node::TypeOne'。(在我的 equal_range 通话中)
编译器说他期待一个类型const boost::shared_ptr<Node>&
,但我真的不想为 equal_range 创建一个指向好类型的随机节点的共享指针......(无论如何它都不起作用)
c++ - 提升 multi_index 部分索引
我想在 boost 多索引中实现两组具有相同搜索条件但不同驱逐条件的键。假设我有两组具有相同搜索条件的数据,但一组需要 100 的 MRU(最近使用)列表,另一组需要 200 的 MRU。假设条目是这样的
搜索条件是 student_no,但是对于 sex='m',我们需要 200 的 MRU,对于 sex='f',我们需要 100 的 MRU。现在我有一个解决方案,其中我引入了一个新的有序索引来维护排序.
例如 IndexSpecifierList 将是这样的
现在每次我插入一个新的,我必须使用索引 2 为它取一个 equal_range 并删除最旧的一个,如果有东西被重新使用,我必须通过增加计数器来更新它。
这类问题有更好的解决方案吗?
谢谢,戈库尔。
c++ - 需要加速涉及 Boost 多索引和查找 unordered_multimap 的 C++ 代码
我正在寻找加速基于代理的模型的策略,该模型基于 class 的对象Host
,指向这些对象的指针存储在 Boost 多索引容器中。我使用 Shark 来确定绝大多数时间都被一个函数消耗calcSI()
:
函数calcSI()
必须为类的每个实例计算Host
某些概率,这些概率取决于类的其他实例的属性Host
。(大约有 10,000-50,000 个实例Host
,并且这些计算为每个主机运行大约 25,600 次。)
如果我正确解释了配置文件,则花费的大部分时间都calcSI()
转到Host::isInfectedZ(int)
,它只是计算类型为 Boost unordered_multimap 中的某些内容的实例InfectionMap
:
Host
contains的所有成员InfectionMap carriage
,并简单地计算与特定键关联Host::isInfectedZ(int)
的数量:Infections
int
我无法找到有关
count
Boost 的无序多图的功能成本有多大的信息。我是否应该通过添加到Host
单独的二维数组来跟踪每个键的实例数(即与每个键Infections
关联的数量int
)来增加开销?我想知道对 Boost 多索引进行更大规模的结构性改革,比如消除一两个不需要的复合键索引,是否会更有帮助。多索引的后台维护没有出现在分析器中,这(可能是愚蠢的)让我担心它可能会很大。我在多索引中有 8 个索引,其中大部分是ordered_non_unique。
还有其他我应该关注的可能不会出现在分析器中的事情,还是我错过了分析器的主要结果?
不幸的是,并行化和多线程calcSI()
不是选项。
更新:知道InfectionMap carriage
很少有超过 10 对并且通常有 <5 对可能会有所帮助。
更新 2:我尝试了上面 #1 中提出的策略,给每个Host
数组一个数组int carriageSummary[ INIT_NUM_STYPES ]
,它由 的可能值索引z
(对于大多数模拟,有 <10 个可能的值)。每个条目的值跟踪对 所做的更改carriage
。该Host::isInfectedZ( int z )
函数现在显示为:
z
. 其他一些容器(即不是 unordered_map)对于更大的范围会更有效吗?
也希望获得有关更改多索引的任何反馈。
c++ - boost multi_index 提取的键是否被缓存?
我正在使用 boost::multi_index 和我想根据它的大小索引的数据类型。但是,这种数据类型的 size() 成员函数执行起来很昂贵。multi_index 是否缓存它从其键提取器中获取的值?
例如,如果我创建了一个带有成员函数键 (element.size()) 的有序索引的 multi_index 容器,并插入了一个其大小位于容器中间某处的元素,容器是否会重新调用大小() 在找到正确的插入点之前遍历其内部数据结构时访问的所有元素的成员函数?
c++ - Multimap 和 shared_ptr
我想对我的对象进行排序,以boost::multi_map
引用一些索引。但我存储的不是纯对象,而是包装到boost::shared_ptr
. 这是代码:
但它在这一点上失败了:&boost::shared_ptr<Object>::getIndex
. 从逻辑上讲,该类型没有getIndex
功能。但是如何以这种方式引用该函数呢?
我用简单的方法尝试过Object::getIndex
:
c++ - 哈希和访问
我想为我的对象使用散列存储。这真的比 快std::map<std::string, Object>
吗?我的意思是搜索。据我所知,boost 过程有很多优化。
而且我不确定我的代码是否正确。搜索/插入等时是否真的使用散列键?
c++ - 如何迭代 multi_index
这是我的 multi_index 代码:
现在我想遍历find
.
但是如何获得另一个/结束迭代器?