2014-06-11 2 views
0

C++에서 STL의 multimap을 사용하는 응용 프로그램이 있습니다.멀티 맵에서 사용자 정의 찾기 기능을 사용할 수 있습니까?

multimap에는 사용자 정의 기능과 함께 find 기능을 사용해야합니다. 예를 들어, 내 멀티 맵의 내용은 {"Hello", "World"}, "{"Bye", "World"} and {"Foo", "Bar"}입니다.

"e"가 포함 된 키를 검색하려고합니다. 즉 "Hello"와 "Bye"만 반환해야합니다.

어떻게하면됩니까?

기본적으로 절대적인 평등을 검사하는 이미 정의 된 찾기 기능 대신 내 자신의 사용자 정의 평등을 정의하고 싶습니까?

+1

http://stackoverflow.com/questions/5733254/create-an-own-comparator-for -map (멀티 맵은 정확히 동일합니다.) –

+0

그러나 비교기를 사용하면 데이터가 멀티 맵에 저장되는 방식이 변경되므로 OP가 원하는 것만 큼은 아닙니다. (아마도 "e"가 구체적인 예입니다). – Bathsheba

+0

@Bathsheba 사용자 정의 기능은 (멀티) 맵의 수명 내내 사용됩니다. 예를 들어 다른 맞춤 기능을 사용할 수있는 방법은 없습니다. 'find '에 대한 다른 호출. –

답변

4

c++의지도 (및 멀티 맵)는 키 검색에 최적화 된 데이터 구조입니다. 그러나 검색은 맵을 선언 할 때 사용되는 비교 연산자를 사용하여 수행됩니다. 다른 비교 (이 경우 키에 포함 된 문자)를 사용하여 검색을 수행해야하는 경우, 찾기 조작의 좋은 성능을 사용할 수 없습니다. 유일한 옵션은 선형 검색을 수행하는 것입니다. 다른 옵션은 다른 (사용자 지정) 비교 연산자를 사용하여지도를 선언하는 것입니다.

2

찾고 싶은 것이 있지만 수행 할 수는 있지만 multimap::find을 사용하면 안됩니다. multimap (또는 map)은 키 순서 지정과 동일한 비교자를 사용하여 조회를 수행하기 때문에 (multi)map::find에만 다른 비교기를 사용할 수 없습니다.

그러나 copy_if을 사용하여 원하는 키 - 값 쌍을 다른 컨테이너에 복사 할 수 있습니다.

std::multimap<std::string, std::string> m{{"Hello", "World"}, 
              {"Bye", "World"}, 
              {"Foo", "Bar"}}; 
std::vector<decltype(m)::value_type> vec; 

std::copy_if(m.begin(), m.end(), std::back_inserter(vec), 
    [](decltype(m)::value_type const& kv) { 
     return std::any_of(kv.first.begin(), kv.first.end(), 
          [](decltype(*kv.first.begin()) c) {return c == 'e';}); 
    }); 

vec 당신이 관심있는 키 - 값 쌍을 포함합니다.

Live demo

관련 문제