почему эта программа не печатает правильный второй элемент возвращаемого итератора? - PullRequest
0 голосов
/ 04 октября 2018

Я хочу изменить значение элемента карты, если он уже существует в контейнере карты, то есть посчитать количество элементов в этом контейнере

std :: map < int, int > m;
std :: map < int, int > :: iterator itr;

int arr[] = { 10, 40, 20, 20, 20, 20, 20, 20, 10, 30, 10, 30, 40 };

for (int i : arr) {
    itr = m.find(i);
    if (itr == m.end() ) {
        int value = 0;
        m.insert(std :: make_pair(i, value));
    } else {
        ++itr->second;
    }
}
itr = m.begin();
while (itr != m.end() ) {
    std :: cout << itr->first << " -> " << itr->second << std :: endl;
    ++itr;
}

Я получил неправильный вывод:

10 -> 2
20 -> 5
30 -> 1
40 -> 1

1 Ответ

0 голосов
/ 04 октября 2018

Проблема со строкой int value = 0;.С тех пор, как вы впервые встретили значение, вы столкнулись с ним один раз, а не с нулем.Вместо него должно быть int value = 1;.

Обратите внимание, что for (int i : arr) { m[i] += 1; } выполнит то, что пытается сделать ваш код.В отличие от последовательных контейнеров, ассоциативные контейнеры позволяют получить доступ к элементам, которых еще нет в контейнере, и значение инициализирует их, если они отсутствуют (ноль или инициализирует их по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...