2011-03-31 4 views
0

나는 boost :: multi_index를 사용하면 내 문제를 해결할 수 있지만 라이브러리에 대한 액세스가 제한되어 있으므로 사용할 수없는 것이 있습니다.C++ STD :: MAP 복잡한 키 검색

나의 현재지도 설정은 다음과 같습니다 : 구조체에는 INT와 같이 상당한 검색 정보가 포함되어 있습니다. 내가 원하는 것은 int 나 string으로 검색하여 구조 값을 반환 할 수있는 구조와 같은 구조였습니다. 저는 열쇠를 써야한다고 가정하고 있지만 다른 제안을하기 위해 여기에 왔습니다.

아이디어가 있으십니까?

+0

본질적으로 답을 주셨습니다. 직접 작성하십시오. –

+2

부스트에 문제가 있습니까? – AJG85

+0

std :: pair 을 사용하고 검색을 위해 자신의 술어를 추가 할 수 있습니다. 같은 개체를 가리키는 두 개의 다른지도를 가질 수 있습니다. 어쩌면 문자열과 int를 하나의 키로 해시 할 수 있습니까? – ManicQin

답변

2

조금 혼란 스럽습니다. 당신은이 같은 구조를 가지고 말하는 것 :

(psudocode)

struct Gizmo 
{ 
    Gizmo(int foo, string bar) : foo_(foo), bar_(bar) {}; 
    int foo_; 
    string bar_; 
}; 
Gizmo make_gizmo(int foo, string bar) { return Gizmo(foo,bar); } 
std::map<string, Gizmo> my_gizmos; 

my_gizmos["aaa"] = make_gizmo(1,"hello"); 
my_gizmos["bbb"] = make_gizmo(2,"there"); 

... 그리고 당신이 foo_의 값으로 Gizmo의를 검색 할 수 있도록하려면?

두 가지 주요 옵션이 있습니다.

1) 그냥 자신 펑 사용자 정의 (다시 psudocude) 쓰기 :

struct match_foo : public std::unary_function<...> 
{ 
    match_foo(int foo) : foo_(foo) {}; 
    bool operator()(map<string,Gizmo>::const_iterator it) const 
    { 
    return it->second.foo_ == foo_; 
    } 
private: 
    int foo_; 
}; 

map<string,Gizmo>::const_iterator that = find_if(my_gizmos.begin(), my_gizmos.end(), match_foo(2)); 
}; 

2) foo_ 값의 인덱스를 만들기를, 다시 메인 mapGizmo 매핑. 이지도는 당신이 주요지도, my_gizmos를 업데이트 할 어떤 시간을 유지하는 것이 같은 ...

map<int,map<string,Gizmo>::const_iterator> foo_index; 

을 ... 보일 수 있습니다.

+0

반복자를 사용하는 것이 현명한가요? 맵 을 업데이트하면 무효화 될 수 있습니다. – ManicQin

+0

+1 : 옵션 1의 경우 ... @Manic 자신이주의해야 할 점은지도를 업데이트 할 때마다이를 유지해야한다는 것입니다. – AJG85

+0

@ AJG85 : 아하, OK 그는 단지지도에 추가하고 두 개의지도에서 삭제하는 것을 의미한다고 생각했습니다. – ManicQin

0

검색이 실제로 윈도우 쿼리 ([param0_0, peram0_1] x [param1_0, param1_2] x ...)의 값을 반환해야 함을 의미하므로 효율성을 위해 범위 트리 구조를 사용할 수 있습니다.

관련 문제