Boost MultiIndexContainer 如何使用不同的组合键进行搜索

Boost MultiIndexContainer how to use different composite keys to search?

本文关键字:组合 搜索 MultiIndexContainer 何使用 Boost      更新时间:2023-10-16
typedef multi_index_container<PositionSummary*,
        indexed_by<
                ordered_unique<
                        composite_key<PositionSummary, const_mem_fun<PositionSummary, int, &PositionSummary::positiondate>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::accountid>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::instid> > >,
                ordered_unique<
                        composite_key<PositionSummary, const_mem_fun<PositionSummary, int, &PositionSummary::positiondate>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::instid>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::accountid> > > 
                    > > PositionSummaryContainer;

我可以像下面这样搜索第一个"ordered_unique",如下所示:

PositionSummaryContainer::iterator it = psContainer_.find(boost::make_tuple(date, accountID, instID));

但是,如何根据第二个"ordered_unique"进行搜索呢?既然帐户ID和instID都是字符串?如何告诉程序要使用哪个索引?

按数字 ( get<i>() ( 或按标签(使用 bmi::tag<T> (使用索引。

我将展示一个示例:

丽芙斯在科里鲁

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/composite_key.hpp>
struct PositionSummary {
    int                positiondate() const { return 42;  }
    std::string const& accountid()    const { return acc; }
    std::string const& instid()       const { return ins; }
  private:
    std::string acc = "a";
    std::string ins = "a";
};
namespace bmi = boost::multi_index;
typedef boost::multi_index_container<PositionSummary*,
        bmi::indexed_by<
                bmi::ordered_unique<
                        bmi::tag<struct byPosAccInst>,
                        bmi::composite_key<PositionSummary, 
                            bmi::const_mem_fun<PositionSummary, int, &PositionSummary::positiondate>,
                            bmi::const_mem_fun<PositionSummary, const std::string&, &PositionSummary::accountid>,
                            bmi::const_mem_fun<PositionSummary, const std::string&, &PositionSummary::instid> 
                        > >,
                bmi::ordered_unique<
                        bmi::tag<struct byPosInstAcc>,
                        bmi::composite_key<PositionSummary, 
                            bmi::const_mem_fun<PositionSummary, int, &PositionSummary::positiondate>,
                            bmi::const_mem_fun<PositionSummary, const std::string&, &PositionSummary::instid>,
                            bmi::const_mem_fun<PositionSummary, const std::string&, &PositionSummary::accountid> 
                        > > 
                    > > PositionSummaryContainer;
int main() 
{
    PositionSummaryContainer c;
    c.insert(new PositionSummary());
    {
        auto& index = c.get<0>();
        auto it = index.find(boost::make_tuple(42, "a", "a"));
    }
    {
        auto& index = c.get<1>();
        auto it = index.find(boost::make_tuple(42, "a", "a"));
    }
    // by tag:
    {
        auto& index = c.get<byPosAccInst>();
        auto it = index.find(boost::make_tuple(42, "a", "a"));
    }
    {
        auto& index = c.get<byPosInstAcc>();
        auto it = index.find(boost::make_tuple(42, "a", "a"));
    }
}