c++ - stl: эстетические предпочтения для заполнения map


2

Стоит задача:

есть контейнер std::map<int, int>

необходимо добавить в контейнер элемент, если такого элемента в контейнере нет или увеличить значение second, если элемент в контейнере присутствует

Интересно ваше мнение, какой подход лучше (как я понимаю по функциональности и скорости предложенные варианты идентичные на 100%, так что остается только эстетическая составляющая, но я могу и ошибаться).

Решения:

вариант 1:

std::map<int, int>::iterator it = m_container.find(key);

if (it != m_container.end())
    it->second += value;
else
    m_container.insert(std::pair<int, int>(key, value));

вариант 2:

auto res = m_container.insert(std::pair<int, int>(key, value));

if ((res.second == false) && (res.second != m_container.end())
    res.first->second += value;

ну или, если считать, что никаких косяков не должно произойти, то просто

auto res = m_container.insert(std::pair<int, int>(key, value));

if (res.second == false)
    res.first->second += value;

P.S.

полностью написал все эти iterator, потому, что не уверен, что использование auto не решит вставить константный итератор (для std::map::find)

P.P.S.

а может это все как-то более компактно, логически и правильно делается в c++1x?

Источник
  •  146
  •  2
  • 9 янв 2018 2018-01-09 06:43:46

2 ответа

2
#include <iostream>
#include <map>

std::map<int, int> m;

void inc(int key, int value)
{
    m[key] += value;
}

int main(int argc, char *argv[])
{
    inc(1, 1);
    inc(1, 3);

    inc(2, 2);
    inc(2, 5);

    std::cout << m[1] << " " << m[2];

    return 0;
}

Результат: 4 7

6

Мне кажется, что так короче и проще всего...

m_container[key]+=value;

Если, конечно, устраивает нулевое начальное значение, т.е. после вставки первого элемента значение будет равно value.

  • 9 янв 2018 2018-01-09 06:46:37
@Zhihar Нет, для строк будет добавляться пустая строка. Так что никаких проблем не будет. В общем случае добавляется тип(), что для чисел соответствует 0, для строк - "". — 9 янв 20182018-01-09 07:04:16.000000
@Zhihar, Вы складываете intы, ответ Вам для intов. Если интересует решение для других типов, приведите эти типы. Тип «буквы» в C++ отсутствует. — 9 янв 20182018-01-09 07:04:16.000000
@HolyBlackCat, а какие могут быть из-за этого косяки? только если я складываю не числа, а например буквы и будет тогда вместо a + b + c = abc 0abc? В общем не совсем корректный результат, а для чисел вроде никаких проблем не должно возникнуть? — 9 янв 20182018-01-09 07:04:16.000000
@Zhihar Если элемента не было, то m_container[key]+=value; сначала вставит ноль, а потом прибавит нему 1. — 9 янв 20182018-01-09 07:04:16.000000
нет, нулевое значение не устраивает - т.е. если элемент не добавлялся, то его как бы и нет, или что-то не так я понял? — 9 янв 20182018-01-09 07:04:16.000000