2013-07-19 4 views
3

제 질문을 설명하기 위해 Boost 도움말 doc의 "Phonebook"예제에서 아래 코드를 복사했습니다.부스트 multi_index_container partial_index_search의 결과를 기반으로 부분 색인 검색

struct phonebook_entry 
{ 
    std::string family_name; 
    std::string given_name; 
    std::string ssn; 
    std::string phone_number; 
} 

그리고 난 후, 가족의 이름이다 "화이트"입니다 사람의 수를 계산 "얼마나 많은을 찾아 갈 필요가 있다면 나는, 그러나

// search for Dorothea White's number 
phonebook::iterator it=pb.find(boost::make_tuple("White","Dorothea")); 

아래와 같이 부분 검색을 할 수 화이트 "는"Dorothea "를 그들의 주어진 이름으로 가지고 있습니다, 그러면 그것을하는 가장 좋은 방법은 무엇입니까? pb.find (boost :: make_tuple ("White") 및 pb.find (boost :: make_tuple ("White", "Dorothea")) 부분 쿼리를 두 번 할 수 있다고 생각합니다. 뿐만 아니라

std::pair<iterator,iterator> partialResults=pb.equal_range("White"); 
std::pair<iterator, iterator> partialOfPartial=pb.equal_range("Dorothea", partialResults); 

또는이 작업을 수행 할 수있는 현명한 방법이있다?.? 두 번째 쿼리는 첫 번째 쿼리에 대한 지식이 없으며 단지 전체 컨테이너를 검색하기 때문에 다음과 같은 것을 제공 부스트합니까 을 성능 문제의 원인 편의상보기 만하면되지만 성능은 향상됩니다.

답변

3

phonebook에는 합성 키가 있기 때문에 성 내에 주어진 이름으로 정렬됩니다. 따라서 std::equal_range을 호출 할 수 있습니다 정의 전용 "도로시"가 match a dummyphonebook_entry에 대한 첫 번째 검색 결과 :

int main() 
{ 
    phonebook pb; // no initializer_list support for multi_index_container yet 
    pb.insert({ "White", "Dorothy", "1" }); 
    pb.insert({ "Black", "Dorothy", "2" }); 
    pb.insert({ "White", "John", "3" }); 
    pb.insert({ "Black", "John", "4" }); 
    pb.insert({ "White", "Dorothy", "5" }); 

    auto const w = pb.equal_range("White"); 
    auto const d = phonebook_entry{"", "Dorothy", ""}; 
    auto const wd = std::equal_range(w.first, w.second, d, [](phonebook_entry const& lhs, phonebook_entry const& rhs) { 
     return lhs.given_name < rhs.given_name; 
    }); 
    std::for_each(wd.first, wd.second, [](phonebook_entry const& pbe) { 
     std::cout << pbe.phone_number << "\n"; 
    }); 
} 

Live example "화이트, 도로시"1

+0

5. 귀하의 답변에 감사드립니다 전화 번호를 인쇄합니다. 나는 또 다른 질문이있다. std :: equal_range 및 pb.equal_range에 성능이 있습니까? 위의 내용은 단지 샘플 일 뿐이며 실제 작업에는 1 억 개의 레코드가 포함될 것입니다. 그러한 수의 레코드가 multi_index_container의 성능에 영향을 미칩니 까? – Michael

+0

@Michael 아무런 문제가 없다.이 Boost 라이브러리를 사용하는 방법에 대해 잘 알고 있었다. 나는 꽤 오랫동안 다음과 같이하고 싶었다 :-) – TemplateRex

+0

성능에 관한 @Michael : 'equal_range' (컨테이너 멤버와 비 멤버 STL 버전)는 정렬 된 입력에서'O (log N)'복잡성을 가지고 있습니다. 보다 빠른 알고리즘을 원하면 해시 키로 변경할 수 있습니다 (multi_index 프레임 워크 내). 이는 평균적인 경우에 O (1) 검색 복잡성을 줄 것이지만, 메모리 레이아웃이 좀 더 비싸게들 것입니다. (정확한 스펙을 찾기 위해 문서를 확인하십시오). 범위에서 정렬되지 않은 경우 주어진 이름의 두 번째 하위 검색 결과가 선형이 될 수 있습니다 (확실하지 않은 경우 문서 확인). 응용 프로그램에 가장 적합한 버전을 프로파일 링해야합니다. – TemplateRex