如何从多索引中获取值

时间:2011-03-08 09:54:52

标签: c++ visual-c++ boost logic

我正在尝试使用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;
}

3 个答案:

答案 0 :(得分:0)

答案 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;
}