2011-03-08 196 views
2

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

你能不能请,更具体?至少给我们一下容器的定义。 – vissi 2011-03-08 10:01:57

+0

@vissi查看编辑 – prabhakaran 2011-03-08 10:08:23

+0

你的代码给了我一堆编译错误。主要原因是bmi :: multi_index_container的第二个模板参数需要一个bmi :: indexed_by。 (至少对于我有的Boost版本;我不保证这在某些时候没有改变。) – 2011-03-08 15:25:44

回答

0
+0

我试图回答它,但它显示了一些编译错误 – prabhakaran 2011-03-08 10:21:49

+0

我找不到具体的方法从这些链接中获取价值。我想要一个像std :: map-> find(2) - > second – prabhakaran 2011-03-08 10:24:54

+1

的方法哦,等等。那么它根本不是“特定索引的价值”。调用find()的结果是一个迭代器。您可以通过取消引用来获得它指向的特定内容。这是EnumStruct类型的东西(在你的情况),所以你可以正常使用它的字段。 tmp_Container.get .find(“aaa”) - > microsoftEnumString或其他。 – 2011-03-08 15:25:21

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"; 
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; 
}