제 질문을 설명하기 위해 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);
또는이 작업을 수행 할 수있는 현명한 방법이있다?.? 두 번째 쿼리는 첫 번째 쿼리에 대한 지식이 없으며 단지 전체 컨테이너를 검색하기 때문에 다음과 같은 것을 제공 부스트합니까 을 성능 문제의 원인 편의상보기 만하면되지만 성능은 향상됩니다.
5. 귀하의 답변에 감사드립니다 전화 번호를 인쇄합니다. 나는 또 다른 질문이있다. std :: equal_range 및 pb.equal_range에 성능이 있습니까? 위의 내용은 단지 샘플 일 뿐이며 실제 작업에는 1 억 개의 레코드가 포함될 것입니다. 그러한 수의 레코드가 multi_index_container의 성능에 영향을 미칩니 까? – Michael
@Michael 아무런 문제가 없다.이 Boost 라이브러리를 사용하는 방법에 대해 잘 알고 있었다. 나는 꽤 오랫동안 다음과 같이하고 싶었다 :-) – TemplateRex
성능에 관한 @Michael : 'equal_range' (컨테이너 멤버와 비 멤버 STL 버전)는 정렬 된 입력에서'O (log N)'복잡성을 가지고 있습니다. 보다 빠른 알고리즘을 원하면 해시 키로 변경할 수 있습니다 (multi_index 프레임 워크 내). 이는 평균적인 경우에 O (1) 검색 복잡성을 줄 것이지만, 메모리 레이아웃이 좀 더 비싸게들 것입니다. (정확한 스펙을 찾기 위해 문서를 확인하십시오). 범위에서 정렬되지 않은 경우 주어진 이름의 두 번째 하위 검색 결과가 선형이 될 수 있습니다 (확실하지 않은 경우 문서 확인). 응용 프로그램에 가장 적합한 버전을 프로파일 링해야합니다. – TemplateRex