Boost MultiIndex Container如何使用不同的组合键进行搜索?
Boost MultiIndexContainer how to use different composite keys to search?
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" 进行搜索?由于 accountID 和 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"));
}
}
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" 进行搜索?由于 accountID 和 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"));
}
}