std :: multimap <key, value>와 std :: map <key, std :: set <value>>의 차이점은 무엇입니까?


답변:


52

멀티 맵은 키와 값이 여러 번 나타날 수있는 (키, 값) 쌍을 저장합니다.

map<key, set<value>>단지 특정 키에 대한 한 번 각 값을 저장합니다. 그렇게하려면 키뿐만 아니라 값을 비교할 수 있어야합니다.

동일하게 비교되는 값이 동일하거나 어쨌든 별도로 저장하려는 경우 응용 프로그램에 따라 다릅니다. 아마도 그들은 다르지만 집합에 대한 비교에 참여하지 않는 필드를 포함 할 수 있습니다.


5
따라서 std :: multimap <key, value>는 std :: map <key, std :: multiset <value>>와 같습니다. 차이점은 나중에 값이 정렬된다는 것입니다. 맞습니까?
大 宝剑 2011-12-22

2
아니요, std::multimap<key, value>동일한 키가 여러 번 표시되도록 허용하지만 std::map<key, whatever>의 고유성이 필요합니다 key.
Yixing Liu

75

A std::map는 유형 값과 연결된 고유 키를 가질 수있는 연관 컨테이너입니다. 예를 들면

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}

A std::multimap는 a std::map와 같지만 키가 더 이상 고유하지 않습니다. 따라서 하나의 고유 한 항목을 찾는 대신 다양한 항목을 찾을 수 있습니다. 예를 들면

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}

은와 std::set비슷 std::map하지만 값과 관련된 키를 저장하지 않습니다. 키 유형 만 저장하고 세트 내에서 고유함을 보장합니다.

std::multiset동일한 패턴을 따르는, 도 있습니다 .

이러한 모든 컨테이너는 find / equal_range와 함께 O (log (n)) 액세스를 제공합니다.


6
멀티 맵 기능에서이 줄 std::pair<auto first, auto second> range = myMap.equal_range("test");은 작동하지 않습니다 error: 'auto' not allowed in template argument. const auto range = myMap.equal_range("test")대신 사용하십시오 .
vancexu 2014 년

2
mapType? 4 행의 MapType이어야하지 않습니까?
lolololol ol

누가 먼저인지 확실하지 않지만 하나는 분명히 다른 것의
large_prime_is_463035818

1
아하, cppbuzz는 StackOverflow 또는 무엇을 긁어 모으고 있습니까?, 몇 년 전에 C ++로 매일 코딩하고 있었을 때이 답변을 직접 작성했습니다. 그리고 실제로 오타 라인 4가, 감사 @lololololol
타입 정의

1
(그리고 그들의 복사 / 붙여 넣기 실패, 그들은 std :: map 선언 : std :: map <std :: string, int> 템플릿에 타입도 표시하지 않습니다)
typedef

13
map::insert

map컨테이너는 중복 키 값을 허용하지 않기 때문에 삽입 작업은 삽입 된 각 요소에 대해 동일한 키 값을 가진 컨테이너에 이미있는 다른 요소가 있는지 확인합니다. 해당 요소가 삽입되지 않고 매핑 된 값이 어떤 식 으로든 변경되지 않습니다.

반면에

multimap::insert 

동일한 키로 여러 항목을 삽입 할 수 있습니다.

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/


차이점과 내부적으로 작동하는 방식에 대한 좋은 링크입니다. 링크
Rndp13 2015 년

10

후자는 값을 정렬 할 수 있어야하지만 ( operator<비교 함수 를 통해 ) 전자는 그렇지 않습니다.


operator <가 맵이나 멀티 맵에서 동일하게 작동합니까? en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

예, 그러나 내 대답은 값의 순서를 참조했습니다. T주문이없는 유형 이 있다고 가정합니다 . 을 (를) 만드는 데 사용할 수 있지만을 (를) 만드는 데 std::multimap<U, T>사용할 수 없습니다 std::map<U, std::set<T> >.
Björn Pollex 2013-06-24
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.