Dělat STL mapy inicializaci primitivní typy na vložku?

hlasů
43

Mám std::maptakhle:

map<wstring,int> Scores;

Ukládá jména hráčů a skóre. Když někdo dostane určitý počet bodů bych prostě udělat:

Scores[wstrPlayerName]++;

Když tam je do mapy s klíčem žádný prvek wstrPlayerName, že vytvoří jeden, ale to inicializovat na nulu nebo null před přírůstku nebo je to nedefinovaný?

By měl testovat I v případě, že element existuje před každým přírůstek?

Položena 03/02/2009 v 18:00
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
61

Operátor [] vypadá takto:

Value& map<Key, Value>::operator[](const Key& key);

Pokud ji nazývat s klíčem , který je dosud v mapě, bude výchozí-postavit novou instanci hodnoty , dát to do mapy pod klíčem vám prošel v roce, a vrátí odkaz na ni. V tomto případě máte:

map<wstring,int> Scores;
Scores[wstrPlayerName]++;

Hodnota zde je int a ints jsou default-postavena 0, jako kdybyste je inicializován s int () . Ostatní primitivní typy jsou inicializovány podobně ( např , double () , dlouhý () , bool () , atd.).

Na konci váš kód vloží nový pár (wstrPlayerName, 0) v mapě a poté se vrátí odkaz na int, kterou pak přírůstek. Takže, není třeba otestovat, zda existuje element ale pokud chcete věci začít od 0 ° C.

Odpovězeno 03/02/2009 v 18:11
zdroj uživatelem

hlasů
11

To bude výchozí-postavit novou instanci value. Pro celá čísla, výchozí konstrukce je 0, tak to funguje, jak bylo zamýšleno.

Odpovězeno 03/02/2009 v 18:03
zdroj uživatelem

hlasů
5

Neměli byste vyzkoušet, zda existuje položka, než zvyšování to. Operátor [] dělá přesně to, co budete potřebovat k tomu, jak již bylo řečeno.

Ale co v případě, že výchozí hodnota postavený nebude pracovat pro vás? Ve vašem případě, že nejlepším způsobem, jak zjistit, zda tento prvek již existuje, je pokusit se jej vložit. insertČlen funkce pro std::mapvrátí std::pair<iterator, bool>. Zda vložka uspěje nebo selže, bude první prvek dvojice poukazují na požadovaný objekt (buď nového, nebo ten, který byl již přítomen). Potom můžete změnit svou hodnotu, jak uznáte za vhodné.

Odpovězeno 03/02/2009 v 18:30
zdroj uživatelem

hlasů
4

Děkuji za pomoc.

Takže std :: map nastavit jejich hodnoty primitivního typu 0.

Jen jsem přemýšlel, protože jsem si myslel primitivní typu věci jsou vždy definována při vytvoření.

Pokud bych napsat něco jako:

int i;
i++;

Kompilátor mě varuje, že i je definován, a když jsem spustit program není obvykle nula.

Odpovězeno 03/02/2009 v 18:32
zdroj uživatelem

hlasů
1

Zkontrolujte, zda pravidla pro inicializaci.

Viz bod 4.9.5 Inicializace C ++ Prog Lang nebo C ++ std knihy. V závislosti na tom, zda je proměnná lokální, statická, uživatelsky definované nebo const výchozí inicializace může stát.

Ve vás případě, int se nazývá POD (Plain starý datový). Jakékoli auto (vytvořen na haldy / místní proměnná) POD proměnná není default inicializaci. Z tohoto důvodu pro vás „i“ shora nebude mít hodnotu nula.

Vždy učinit zvyk inicializace POD, kdy jsou definovány v haldě. Dokonce můžete použít int () inicializovat hodnotu.

Odpovězeno 03/02/2009 v 18:49
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more