2009-10-20 10 views
8

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)); 
+0

Pierwsza z nich jest znacznie bardziej czytelna;) – schnaader

+3

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));" –

+0

@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'. –

Odpowiedz

19

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

0

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.

+0

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. –

7

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.

4

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.