2011-03-08 7 views
2

부스트 멀티 인덱스를 사용하여 하나의 멀티 맵 (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

+0

@vissi 편집 – prabhakaran

+0

코드를 보면 컴파일 오류가 발생합니다. 주된 이유는 bmi :: multi_index_container에 대한 두 번째 템플릿 인수가 주위에 bmi :: indexed_by가 필요하기 때문입니다. (적어도 내가 가지고있는 Boost 버전의 경우, 이것이 어떤 점에서 바뀌지 않았다는 것을 보장하지는 않는다.) –

답변

0

같은 특정 인덱스의 값을 얻는 방법을 알 수 있습니다 당신은 project 기능이 필요합니다. http://www.boost.org/doc/libs/1_39_0/libs/multi_index/doc/tutorial/basics.html#projectionhttp://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")).

+0

나는 그걸 알아 내려고했지만, 컴파일 오류를 보였다. – prabhakaran

+0

특정 방법을 찾을 수 없다. 해당 링크에서 가치를 얻으십시오. std :: map-> find (2) -> second와 같은 메소드를 원합니다. – prabhakaran

+1

오, 기다려주세요. 그렇다면 "특정 색인의 가치"가 아닙니다. find()를 호출 한 결과는 반복자입니다. 역 참조로 가리키는 특정 것을 얻을 수 있습니다. 그것은 EnumStruct 타입의 것입니다 (귀하의 경우) 그래서 그냥 정상적으로 필드를 사용할 수 있습니다. tmp_Container.get .find ("aaa") -> microsoftEnumString 또는 무엇이든간에. –

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 index 지정은 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; 
}