Znalazłem, że mają jeden klucz i wiele wartości, które są unikalne.Jaka jest różnica między std :: multimap <key, value> a std :: map <kluczem, std :: set <value>>
Odpowiedz
Multimap przechowuje pary (klucz, wartość), w których zarówno klucz, jak i wartość mogą pojawić się kilka razy.
Każda wartość zostanie zapisana tylko dla określonego klucza. Aby to zrobić, musi być w stanie porównać wartości, a nie tylko klucze.
To zależy od aplikacji, jeśli wartości, które są porównywalne, są równoważne, lub jeśli mimo to chcesz je przechowywać oddzielnie. Być może zawierają one inne pola, ale nie biorą udziału w porównaniu do zestawu.
Ta ostatnia wymaga, aby można było zamówić wartości (za pomocą operator<
lub funkcji porównania), pierwsza nie.
Wygląda na to, że operator
Tak, ale moja odpowiedź dotyczyła kolejności wartości. Załóżmy, że masz typ "T", który nie ma porządku. Możesz go użyć do utworzenia 'std :: multimap ', ale nie możesz użyć do utworzenia 'std :: map >. –
map::insert
Ponieważ map
pojemniki nie pozwalają na podwójnych wartości kluczowych, kontrole operacji wstawiania dla każdego elementu wstawionego czy inny element już istnieje w pojemniku z tą samą wartością klucza jeśli tak, element nie jest włożona i jego odwzorowany wartość nie została w żaden sposób zmieniona.
Natomiast
multimap::insert
na może wstawić dowolną liczbę przedmiotów z tym samym kluczem.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
Dobry link zarówno na temat różnicy, jak i sposobu działania wewnętrznego. [link] (http: //www.ccplusplus.com/2014/02/how-map-and-multimap-works-c.html) – Rndp13
std::map
jest asocjacyjne pojemnik, który pozwala mieć unikatowy klucz skojarzony z wartości znamionowej. Na przykład
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;
}
std::multimap
jest równa std::map
, ale klucze nie są już unikatowe. Dlatego możesz znaleźć wiele przedmiotów, zamiast znaleźć tylko jeden unikalny przedmiot. Na przykład
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
jest jak std::map
, ale to nie jest przechowywanie klucza związanego z wartością. Przechowuje tylko typ klucza i zapewnia, że jest unikalny w zestawie.
Masz również std::multiset
, który ma taki sam wzór.
Wszystkie te kontenery zapewniają dostęp do O (log (n)) z ich find/equal_range.
W funkcji multimap, linia 'std :: pair
mapType? Czy nie powinien to być MapType w linii 4? –
nie jestem pewien, kto był pierwszy, ale jeden jest oczywiście kopią drugiej: https://www.cppbuzz.com/What-is-difference-between-map-and-multimap – user463035818
- 1. Czy istnieje różnica między std :: map <int, int> a std :: map <const int, int>?
- 2. Różnica między std :: function <> a standardowym wskaźnikiem funkcji?
- 3. jaki jest cel std :: set <VALUE, std :: owner_less <VALUE>>?
- 4. std :: wektor <std::string> crash
- 5. emplace_back nie działa z std :: wektor <std :: map <int, int>>
- 6. Jaka jest różnica między std :: to_string, boost :: to_string i boost :: lexical_cast <std::string>?
- 7. I która sytuacja będzie std :: map <A,B> będzie szybsza niż posortowana std :: vector <std :: pair <A,B>>?
- 8. Inicjowanie std :: shared_ptr <std::map<>> using usztywnione inicjalizacji
- 9. wektora std :: funkcji <>
- 10. Sortowanie std :: wektor <std :: pair <std :: string, bool >> według ciągu znaków?
- 11. Jaka jest różnica między robi wektor <vector<T...>> i grafika <vector<T> ...>
- 12. Porównywanie std :: function <>
- 13. Jaka jest różnica między "<>" a "! ="?
- 14. Jaka jest praktyczna różnica między std :: nth_element a std :: sort?
- 15. C++ Przekształć std :: tuple <A, A, A...> na std :: vector lub std :: deque
- 16. znaleźć w std :: wektor <std::pair>
- 17. Różnica między <string> i <string.h>?
- 18. std :: vector: nie można wiązać 'std :: ostream aka {std :: basic_ostream <char>}' lwartość do 'std :: basic_ostream <char> &&'
- 19. std: numeric_limits <double> :: definicja epsilon
- 20. std :: map z std :: weak_ptr key
- 21. Dlaczego std :: sub_match <T> publicznie dziedziczy ze std :: pair <T, T>?
- 22. Adaptacja funkcję zwracającą std :: przyszłego <T> do std :: przyszłość <U>
- 23. Jak znaleźć największy int w std :: set <int>?
- 24. Jaka jest różnica między <%# %> i <%= %>?
- 25. Przeciążenia operatorów statycznych i użytkowników: std :: operator << i std :: ostream :: operator <<
- 26. std :: array <char, N> na std :: string
- 27. Efektywna konstrukcja std :: string z std :: unordered_set <char>
- 28. błąd powracający std :: set <T> :: iterator w szablonie
- 29. Jak "cast" std :: vector <char> do std :: vector <wchar_t>
- 30. Prawidłowy sposób przeniesienia własności std :: vector <std :: unique_ptr < int>> na konstruowaną klasę
Std :: multimap jest podobny do std :: map >, różnica między nimi jest taka, że późniejsze wartości są sortowane. Czy to prawda? –