2016-10-19 10 views
1

boost::multi_index을 성공적으로 만들고 값을 삽입했습니다. multi_index에는 두 개의 해시 인덱스가 있습니다. 둘 다 멤버 함수이지만 하나는 고유하고 다른 하나는 고유하지 않습니다.boost :: multi_index에서 값 가져 오기

해시 값을 사용하여 컨테이너에서 값을 가져 오는 방법을 알아 내려고하고 있습니다. 내가 어떻게해야하는지 이해할 수 없었다. 나는 온라인으로 수색했으며, 많은 사람들이이 질문을 한 것을 알고있다. 그러나 나는해야 할 일이 무엇인지 이해하지 못합니다. C++ 11에서 몇 가지 솔루션을 보았지만 C++ 11을 사용하지 않고 무엇이 수행되고 있는지 이해하지 못합니다. 누군가 제게 그것을 사용하는 방법을 설명해 주시겠습니까?

  1. 는 (있는 경우) 그 값을 가져
  2. 에 값이 아닌 고유 ID 맵을 가져,
    #include "stdafx.h" 
    #include<multi_index_container.hpp> 
    #include<boost/multi_index/hashed_index.hpp> 
    #include<boost/multi_index/mem_fun.hpp> 
    #include<boost/multi_index/tag.hpp> 
    
    
    
    class RetClass 
    { 
        int a, b; 
    }; 
    
    class StoreMe 
    { 
        RetClass ex; 
        std::string exStr; 
        int id; 
    public: 
        void setId(RetClass a) 
        { 
         ex = a; 
        }; 
    
    
        virtual const RetClass& getId() const { return ex; } 
        virtual std::string getIdString() const { return exStr; } 
        int getUniqueId() const { return id; } 
    }; 
    
    struct IndexByStringId{}; 
    struct IndexByUniqueId{}; 
    
    typedef boost::multi_index_container< 
        StoreMe, 
        boost::multi_index::indexed_by< 
         boost::multi_index::hashed_unique< 
          boost::multi_index::tag<IndexByStringId>, 
          boost::multi_index::const_mem_fun<StoreMe, std::string,  &StoreMe::getIdString> 
         >, 
         boost::multi_index::hashed_non_unique< 
          boost::multi_index::tag<IndexByUniqueId>, 
          boost::multi_index::const_mem_fun<StoreMe, int,  &StoreMe::getUniqueId> 
         > 
        > 
    > mi_storeMe; 
    
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
        return 0; 
    } 
    

    나는 할 수 있도록하려면, 내 코드는 아래의 고유 ID

이 작업을 수행하는 데 올바른/간단한 방법을 알려주십시오. 또한 나는 C++ 11을 사용하지 않는다. 여기

답변

0

당신이 문자열 기반 인덱스에서 검색 줄 방법은 다음과 같습니다 ID를 기반 인덱스를 들어

mi_storeMe container; 

std::string needle = whatToSearchFor(); 
auto iterator = container.get<IndexByStringId>().find(needle); 
if (iterator != container.get<IndexByStringId>().end()) 
    found(*iterator); 
else 
    notFound(); 

, 그것은 매우 유사 :

mi_storeMe container; 

RetClass needle = whatToSearchFor(); 
auto range = container.get<IndexByUniqueId>().equal_range(needle); 
processRangeFromTo(range.first, range.second); 

대답은 C에서 auto를 사용합니다 ++ 11 그래서 관련된 유형의 철자법을 피할 수 있습니다. C++ 11에 액세스 할 수 없다면 Boost의 multi_index 설명서를 읽고 직접 유형 공제를하십시오. 나는 정확성에 대한 신뢰도를 보장 할 수 없습니다,하지만 난 접선 관련


mi_storeMe::index<IndexByStringId>::type::iterator 

로 반복자 타입이 철자 할 수 있다고 생각 : C++ (11)없이 다중 색인 컨테이너의 printf 스타일의 디버깅을 수행하는 방법.

처음에는 auto이 없지만 템플릿에는 여전히 유형 공제가 있음을 기억하십시오.

const mi_Container::index<IndexByIdString>::type& index = container.get<IndexByIdString>(); 
for (
    mi_Container::index<IndexByIdString>::type::iterat‌​or it = index.begin(), end = index.end(); 
    it != end; 
    ++it 
) 
{ 
    operate_on(*it); 
} 
+0

이 잘 @Agnew인가 :

template <class It> void printContainerItems(It from, It to) { for (; from != to; ++from) print(*from); } printContainerItems(container.begin(), container.end()); 

둘째, 당신은 쉽게 인덱스를 반복 할 수 있습니다 : 함수 템플릿 그들에게 추론 할 수있는 경우에 필요가 유형의 철자 없습니다? 'std :: pair :: 유형 :: 반복자, mi_Container :: 인덱스 :: 유형 :: 반복자> range_it = Containers.get (). equal_range (nonEqId); \t 경우 (range_it.first! = Containers.get (). 말()) \t \t //이 \t 가 {// 우리는 값 \t \t의 범위가있을 수 있습니다 발견 된 경우 (mi_Container :: 인덱스 :: 타입 :: iterator it = range_it.first; it! = range_it.둘째; it ++) \t \t { \t \t \t value = * it; // iterator가 가리키는 값을 얻고, "value"에서 원하는 것을 수행하십시오. . . .' – codeworks

+0

들여 쓰기가 불편해서 여기에서 들여 쓰기가 불가능합니다. @Agnew .. – codeworks

+0

@codeworks 한 눈에 잘 보이지만 컴파일러와 프로그램에 대해 묻지 않으시겠습니까? ;-) – Angew