나는 그들이 하나의 키와 고유 한 여러 값을 가지고 있음을 발견했습니다.
답변:
멀티 맵은 키와 값이 여러 번 나타날 수있는 (키, 값) 쌍을 저장합니다.
는 map<key, set<value>>
단지 특정 키에 대한 한 번 각 값을 저장합니다. 그렇게하려면 키뿐만 아니라 값을 비교할 수 있어야합니다.
동일하게 비교되는 값이 동일하거나 어쨌든 별도로 저장하려는 경우 응용 프로그램에 따라 다릅니다. 아마도 그들은 다르지만 집합에 대한 비교에 참여하지 않는 필드를 포함 할 수 있습니다.
std::multimap<key, value>
동일한 키가 여러 번 표시되도록 허용하지만 std::map<key, whatever>
의 고유성이 필요합니다 key
.
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)) 액세스를 제공합니다.
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")
대신 사용하십시오 .
map::insert
map
컨테이너는 중복 키 값을 허용하지 않기 때문에 삽입 작업은 삽입 된 각 요소에 대해 동일한 키 값을 가진 컨테이너에 이미있는 다른 요소가 있는지 확인합니다. 해당 요소가 삽입되지 않고 매핑 된 값이 어떤 식 으로든 변경되지 않습니다.
반면에
multimap::insert
동일한 키로 여러 항목을 삽입 할 수 있습니다.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
후자는 값을 정렬 할 수 있어야하지만 ( operator<
비교 함수 를 통해 ) 전자는 그렇지 않습니다.
T
주문이없는 유형 이 있다고 가정합니다 . 을 (를) 만드는 데 사용할 수 있지만을 (를) 만드는 데 std::multimap<U, T>
사용할 수 없습니다 std::map<U, std::set<T> >
.