【发布时间】:2010-12-14 13:21:38
【问题描述】:
我在让 boost::multi_index_container 同时使用随机访问和 orderd_unique 时遇到问题。 (很抱歉这个冗长的问题,但我想我应该举个例子..)
这里有一个例子:假设我想在工厂中生产 N 个对象,并且对于每个对象我都有一个需要满足的需求(这个需求在创建多索引时是已知的)。 好吧,在我的算法中,我得到了中间结果,我将其存储在以下类中:
class intermediate_result
{
private:
std::vector<int> parts; // which parts are produced
int used_time; // how long did it take to produce
ValueType max_value; // how much is it worth
};
向量parts 描述了生成了哪些对象(它的长度为 N,并且它在字典上比我的 coresp 需求向量小!) - 对于每个这样的向量,我也知道 used_time。此外,我得到了这个生成对象向量的值。
我有另一个约束,所以我不能生成每个对象 - 我的算法需要在数据结构中存储多个 intermediate_result-objects。这里使用了boost::multi_index_container,因为parts 和used_time 描述了一个唯一的intermediate_result(它在我的数据结构中应该是唯一的)但是max_value 是另一个索引我必须考虑一下,因为我的算法总是需要intermediate_result 最高的max_value。
所以我尝试将boost::multi_index_container 与ordered_unique<> 一起用于我的“parts&used_time-pair”和ordered_non_unique<> 用于我的max_value(不同的intermediate_result-objects 可能具有相同的值)。
问题是:决定哪个“parts&used_time-pair”更小的谓词在我的parts-vector 上使用std::lexicographical_compare,因此对于许多intermediate_result-objects 来说非常慢。
但是会有一个解决方案:我对每个对象的需求不是那么高,因此我可以在每个可能部分向量上存储中间结果,唯一地通过其used_time。
例如:如果我有一个需求向量( 2 , 3 , 1),那么我需要一个数据结构来存储(2+1)*(3+1)*(1+1)=24 可能的部分向量,并且在每个这样的条目上都有不同的used_times,它们必须是唯一的! (存储最小的时间是不够的——例如:如果我的附加限制是:满足给定的生产时间)
但是如何将random_access<>-index 与ordered_unique<>-index 结合起来呢?
(Example11 在这方面没有帮助我..)
【问题讨论】:
-
哦,我忘了提:如果我在向量之前测试 used_time,则“parts&used_time-pair”唯一性的谓词不会更快。此外,我尝试使用
hashed_unique<>而不是ordered_unique<>- 但我必须将向量和 used_time 推送到字符串中才能使用散列(生成的 multi_index 较慢)。有没有更好的方法来使用哈希或使用自己的 random_access 数据结构(保证唯一性)与其他排序索引(对于 max_value)链接?
标签: c++ boost random-access multi-index