【问题标题】:boost::multi_index_container: Find index iterator from other index iteratorboost::multi_index_container:从其他索引迭代器中查找索引迭代器
【发布时间】:2015-04-03 06:03:21
【问题描述】:

我有一个由 2 个索引索引的 multi_index_container。我可以通过其中一个找到值,但是是否可以从另一个对应的索引中找到迭代器?

例子:

struct ById{};
struct ByName{};

typedef multi_index_container<
MyStruct,
indexed_by<
    ordered_unique<tag<ById>, member< MyStruct, int, &MyStruct::id> >,
    ordered_non_unique<tag<BySalary>, member< MyStruct, int, &MyStruct::salary> >
>
> MyStructsContainer;

typedef MyStructsContainer::index<ById>::type MyStructsContainerById;
typedef MyStructsContainer::index<BySalary>::type MyStructsContainerBySalary;

....

MyStructsContainerById& byId = myStructsContainer.get<ById>();
MyStructsContainerById::iterator itById = byId.find(3);

问题是,有没有一种简单的方法可以找到对应的:

MyStructsContainerByName::iterator itBySalary

哪个指向完全相同的值 (*itById)?

谢谢, 卡林

【问题讨论】:

    标签: boost multi-index


    【解决方案1】:

    您正在寻找boost::multi_index::project

    http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/reference/multi_index_container.html#projection

    给定具有索引 i1 和 i2 的 multi_index_container,我们说 i1 迭代器 it1 和 i2 迭代器 it2 在以下情况下是等价的:

    • it1==i1.end()it2==i2.end()

    • it1it2 指向同一个元素。

    在您的示例中

    auto& byId = myStructsContainer.get<ById>();
    auto itById = byId.find(3);
    

    你可以使用

    MyStructsContainerByName::iterator itBySalary = project<1>(
          myStructsContainer, itById);
    

    或者确实:

    auto itBySalary = project<BySalary>(myStructsContainer, itById);
    

    效果一模一样

    【讨论】:

    • 还有一个问题。 “项目”常量的复杂性是多少?我希望它不会做一些迭代等等......
    • MyStructsContainer 被定义为它的第一个索引(ById,或索引 0)
    • @KalliMan 好吧。我链接的页面显示“复杂性:恒定”。 粗体字。你还想知道什么?
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多