我正在尝试使用boost-multi索引做一个多映射(4个变量)。我可以知道如何获取特定索引的值,如
tmp_Container.get<name>().find("aaa")->firstVariable
修改
struct EnumStruct
{
int microsoftEnum;
std::string microsoftEnumString;
int localEnum;
std::string localEnumString;
}
typedef bmi::multi_index_container<
EnumStruct,
bmi::ordered_unique<bmi::tag<localEnum>,bmi::member <
EnumStruct,std::string,&EnumStruct::localEnumString > >
>
> boost_Enum_Container;
boost_Enum_Container enumStructContainer;
int main()
{
enumStructContainer.insert(EnumStruct(1,"MS_1",11,"LOC11"));
enumStructContainer.insert(EnumStruct(2,"MS_2",22,"LOC22"));
enumStructContainer.insert(EnumStruct(3,"MS_3",33,"LOC33"));
//enumStructContainer.get<0>().find(1);
//boost_Enum_Container::index<localEnum>::type&
localEnum_Index=enumStructContainer.get<localEnum>().find(22)->firstVariable;
boost_Enum_Container::iterator
return 0;
}
答案 0 :(得分:0)
您需要project
功能。请参阅http://www.boost.org/doc/libs/1_39_0/libs/multi_index/doc/tutorial/basics.html#projection和http://www.boost.org/doc/libs/1_46_0/libs/multi_index/doc/reference/multi_index_container.html#projection。因此:tmp_Container.project<0>(tmp_Container.get<name>.find("aaa"))
。
答案 1 :(得分:0)
您以错误的方式使用boost::multi_index::tag
。要使用它,您必须提供有效的结构。
此外,您正在尝试搜索字符串索引中的数字。下面的代码必须工作,但我没有测试它。
struct LOCALENUM { };
struct LOCALENUMSTR { };
using namespace boost::multi_index;
typedef boost::multi_index_container<
EnumStruct,
indexed_by<
ordered_unique<tag<LOCALENUM>,member<EnumStruct,int,&EnumStruct::localEnum > >
>,
ordered_unique<tag<LOCALENUMSTR>,member<EnumStruct,std::string,&EnumStruct::localEnumString > >
>
>
> boost_Enum_Container;
typedef boost_Enum_Container::index<LOCALENUM>::type::iterator EnumIterator;
typedef boost_Enum_Container::index<LOCALENUMSTR>::type::iterator EnumStrIterator;
EnumIterator enumiter = enumStructContainer.get<LOCALENUM>().find(22);
EnumStruct & enum_struct = (*eniter);
// There you go :
std::cout << enum_struct.microsoftEnumString << "\n";
//Searching for LocalEnumString :
EnumStrIterator enunstriter = enumStructContainer.get<LOCALENUMSTR>().find("LOC22");
EnumStruct & enum_struct = (*enunstriter );
std::cout << enum_struct.microsoftEnumString << "\n";
答案 2 :(得分:0)
正如您在其他近期问题中多次提到的那样,ordered_unique
索引说明符与std::map
具有相同的接口;所以,如果您知道如何使用std::map
( 提示 , 提示 ),那么这应该是非常的简单的:
#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
struct EnumStruct
{
EnumStruct(int const me, std::string const& mes, int const le, std::string const& les)
: microsoftEnum(me),
microsoftEnumString(mes),
localEnum(le),
localEnumString(les)
{ }
int microsoftEnum;
std::string microsoftEnumString;
int localEnum;
std::string localEnumString;
};
namespace bmi = boost::multi_index;
struct localEnum_t;
typedef bmi::multi_index_container<
EnumStruct,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<localEnum_t>,
bmi::member<EnumStruct, int, &EnumStruct::localEnum>
>
>
> boost_Enum_Container;
int main()
{
boost_Enum_Container enumStructContainer;
enumStructContainer.insert(EnumStruct(1, "MS_1", 11, "LOC11"));
enumStructContainer.insert(EnumStruct(2, "MS_2", 22, "LOC22"));
enumStructContainer.insert(EnumStruct(3, "MS_3", 33, "LOC33"));
boost_Enum_Container::index_iterator<localEnum_t>::type iter = enumStructContainer.get<localEnum_t>().find(22);
if (iter != enumStructContainer.get<localEnum_t>().end())
std::cout << "found, localEnumString == " << iter->localEnumString << std::endl;
else
std::cout << "didn't find anything" << std::endl;
}