Jaka jest różnica między operatorem przeciążonym indeksem a wywołaniem metody wstawiania std :: map?std :: mapowa różnica między wywołaniami indeksu i insertów
tj:
some_map["x"] = 500;
vs.
some_map.insert(pair<std::string, int>("x", 500));
Jaka jest różnica między operatorem przeciążonym indeksem a wywołaniem metody wstawiania std :: map?std :: mapowa różnica między wywołaniami indeksu i insertów
tj:
some_map["x"] = 500;
vs.
some_map.insert(pair<std::string, int>("x", 500));
wierzę (umieszczony) nie zastępuje istniejące wartości, a wynik tej operacji można sprawdzić przez badanie wartości bool wartości iteracyjnej/pary zwrócone
Przyporządkowanie do operatora indeksem [] prostu nadpisuje wszystko, co tam jest (wstawianie wpisu, jeśli już go tam nie ma)
Każdy z operatorów insertów i [] może powodować problemy, jeśli nie oczekujesz takiego zachowania i nie uwzględniają go.
Eg z wkładką:
std::map< int, std::string* > intMap;
std::string* s1 = new std::string;
std::string* s2 = new std::string;
intMap.insert(std::make_pair(100, s1)); // inserted
intMap.insert(std::make_pair(100, s2)); // fails, s2 not in map, could leak if not tidied up
i [] operator:
std::map< int, std::string* > intMap;
std::string* s1 = new std::string;
std::string* s2 = new std::string;
intMap[ 100 ] = s1; // inserted
intMap[ 100 ] = s2; // inserted, s1 now dropped from map, could leak if not tidied up
Myślę, że są prawidłowe, ale ich nie skompilowany, więc mogą mieć błędy składniowe
Sposób wkładka wstawia na mapie, a przeciążony operator zwróci indeks elementu z kluczem key_value jeśli to jest na mapie, jeśli nie jest jeszcze na mapie, to wstawi go.
Wstawi się tylko na mapę, jeśli dany klucz nie jest już obecny. Jeśli jest obecny, insert() nie zaktualizuje wartości, podczas gdy przypisanie do operatora [] będzie. –
W przypadku wyrażenia map
poprzednie wyrażenie (operator[]
) zawsze zastąpi część wartości pary klucz-wartość z nową podaną wartością. Nowa para klucz-wartość zostanie wstawiona, jeśli jeszcze nie istnieje.
W przeciwieństwie do tego, wstawi tylko nową parę klucz-wartość, jeśli para klucz-wartość z dostarczoną częścią klucza już nie istnieje na mapie.
Oprócz faktu, że map::operator[]
zastąpi istniejącą wartość jest operator[]
map :: będzie tworzyć i dodawać do mapy domyślną wartość, aby zastąpić istniejące zanim nastąpi wymiana (wywołanie map::operator[]()
musi zwrócić odwołanie do czegoś). Dla przedmiotów, które są drogie w tworzeniu, może to być problem z wydajnością.
Zobacz "Pozycja 24: Wybierz ostrożnie między map::operator[]
i map::insert
, gdy wydajność jest ważna" w Scott Meyers' Effective STL.
Pierwsza z nich jest znacznie bardziej czytelna;) – schnaader
Używanie make_pair() mogłoby pomóc we wstawianiu, ponieważ może wywnioskować typy argumentów: "some_map.insert (std :: make_pair (" x ", 500));" –
@Fred Larson: Mimo że pokazane 'make_pair' wydedukuje' const char * 'i' int', wtedy zostanie wygenerowana niejawna konwersja z jednego 'pair' type do rzeczywistego' value_type' 'mapy'. –