2015-02-10 28 views
2
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”,如下图所示:Boost MultiIndexContainer如何使用不同的组合键进行搜索?

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

但我可怎么办根据第二个“ordered_unique”的搜索?由于accountID和instID都是字符串?我怎样才能告诉程序使用哪个索引?

回答

3

您可以使用数字索引(get<i>())或标记(使用bmi::tag<T>)。

我带你去一个样本:

livce On Coliru

#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")); 
    } 
} 
相关问题