【问题标题】:Cannot find after insertion in boost multi_index在 boost multi_index 中插入后找不到
【发布时间】:2016-10-20 02:10:44
【问题描述】:

我创建了一个 boost multi_index,我在其中插入对象。

我的 multi_index 如下所示,

typedef boost::multi_index_container<
    Container*,
    boost::multi_index::indexed_by<
        boost::multi_index::hashed_unique<
            boost::multi_index::tag<IndexByUniqueId>,
            boost::multi_index::const_mem_fun<StoreMe, Id, &StoreMe::getUId> 
        >,
        boost::multi_index::hashed_non_unique<
            boost::multi_index::tag<IndexByNonUId>,
            boost::multi_index::const_mem_fun<StoreMe, std::string, &Container::getNUIdString> 
        >
    >
> mi_Container;

当我插入对象时,非唯一 ID 和唯一 ID 最初不存在于对象中。在程序的后期,它们会得到更新,只有在“getNUIdString”和“getUId”之后才会返回 0/非空值。

在这种情况下,当我尝试使用非唯一 ID 进行查找时,我无法获取存储的值。是否期望它们在插入时被填充?或者,如果它们在需要时更新并且我仍然可以在那个时候查找我的值,是否可以?

编辑1:

我了解在更改索引时我需要使用“替换”或“修改”来更新索引。那么是不是它最初在插入插入时使用空字符串作为一个索引的键和 0 作为另一个索引的键,并且当我使用特定值查找时它没有返回任何东西?这意味着如果我使用空字符串“”查找。它应该返回我所有的值(因此将是查找时间 O(n))?

编辑2: 我尝试将所有值映射到“”,空字符串。我仍然没有结果。这对迭代器中的第一个等于 end()。

另外,如果我想在该对象的设置器中设置值时,只更改一个非唯一键值对的键值,我该怎么做?每次通过对象的 setter 设置值时,我都想这样做,这样我就可以使用我拥有的 multi_index 来查找它。

TIA

-R

【问题讨论】:

    标签: c++ boost multi-index boost-multi-index


    【解决方案1】:

    您提供的上下文很少,只能猜测。前提是

    • 您已经为您的Id 类正确实现了boost::hash_valueoperator==(如果这确实是一个类而不是基本类型的别名),
    • 您插入的所有元素都有一个空字符串作为IndexByNonUId 索引的键,
    • 您确实设法插入了一些东西(即容器不是空的),
    • 元素仍然有效(我看到它们的类型是 Container *,因此它们可能会被删除或其他什么),
    • 您没有更改元素的键,

    thenIndexByNonUId 索引中查找空字符串应该返回与空范围不同的内容。您可能需要检查以上所有条款。

    【讨论】:

    • 谢谢@Joaquin!以下是您的问题的答案,
    • * 索引返回 std::string * 是 * 是的,我用调试器检查过,容器中有 27xxx 个对象 * 我猜是这样,因为我知道它们应该是 * 是的,我没有改变元素的键,使用replace或类似的否,equal_range("")返回一对,其第一个等于containers.end()
    • 如果您需要更多信息,请告诉我,我可以为您提供。再次感谢
    • 以下是否返回任何元素? (将 c 更改为容器的名称) c.get().equal_range((*c.get().begin())->getNUIdString())
    • 我让你的语句返回到一对迭代器中,代码崩溃了,可能值是NULL?我会调查并通知你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2011-03-29
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多