Как я могу изменить значение в паре на картах - PullRequest
0 голосов
/ 20 мая 2009

Я могу сделать:

map<char*, int> counter;
++counter["apple"];

Но когда я это сделаю:

--counter["apple"] // when counter["apple"] ==2;

У меня отладчик завис в VS 2008.

Есть подсказки?

Ответы [ 3 ]

5 голосов
/ 20 мая 2009

Вы полагаетесь на его ценность? Строковый литерал не обязательно должен иметь один и тот же адрес при его различном использовании (особенно при использовании в разных единицах перевода). Таким образом, вы можете на самом деле создать два значения:

counter["apple"] = 1;
counter["apple"] = 1;

Кроме того, вы не получаете никакой сортировки, поскольку происходит сортировка по адресу. Используйте std::string, у которого нет этой проблемы, поскольку он знает о содержимом и чей operator< сравнивает лексикографический:

map<std::string, int> counter;
counter["apple"] = 1;
assert(++counter["apple"] == 2);
2 голосов
/ 20 мая 2009

Карта вида:

map <char *, int> counter;

не очень разумная структура, потому что она не может эффективно управлять указателями символов, которые она содержит. Измените карту на:

map <string, int> counter;

и посмотрим, излечит ли это проблему.

0 голосов
/ 20 мая 2009

Я нашел проблему. Если я изменю это на:

map<string,int> counter;
counter["apple"]++;

if(counter["apple"]==1)
   counter.erase("apple");
else 
   counter["apple"]--; //this will work

В паре Ключ / значение, если значение является целым числом и значением == 1, я как-то не смог сделать map [ключ] -, (потому что это сделает значение == 0?)

...