std :: multimap <key, value>와 std :: map <key, std :: set <value>>의 차이점은 무엇입니까? 고유 한 여러 값을 가지고 있음을 발견했습니다.

나는 그들이 하나의 키와 고유 한 여러 값을 가지고 있음을 발견했습니다.



답변

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

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

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


답변

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)) 액세스를 제공합니다.


답변

map::insert

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

반면에

multimap::insert

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

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


답변

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


답변