Карта STL: что означает эта команда?

Я наткнулся на решение проблемы конкуренции, использующее карту STL, с другим типом вставки, который я уже знал. Я знаю такие вставки (и их отличия):

Map[key] = value; и Map.insert(make_pair(key,val));

Но этот я понятия не имею, что он делает, просто он работает для проблемы, которую мне нужно решить:

   std::map<int, int> freq;
   int inp;
   // ...

   for (int i = 0; i < n; i++)
    {
        scanf ("%d", &inp);
        freq [inp]++;
    }

    for (int i = 0; i < m; i++)
    {
        scanf ("%d", &inp);
        freq [inp]--;
    }

Где freq — это карта с парой целых чисел, а inp — обычное целое число.


person William Studart    schedule 03.04.2014    source источник


Ответы (3)


не могли бы вы показать, где вы инициализировали freq?, если freq - это «пара» целых чисел, вам нужно получить к ним доступ с помощью «freq[inp].first» и «freq[inp].second», и, насколько я знаю, «pair» не перегружайте оператор + или -.

for (int i = 0; i < n; i++)
{
    scanf ("%d", &inp);
    freq [inp]++;
}

здесь freq хранит, сколько раз целое число было найдено на входе, если вход: 0, 0, 0, 1,1

карта [0] = 3 и карта [1] = 2

for (int i = 0; i < m; i++)
{
    scanf ("%d", &inp);
    freq [inp]--;
}

то же самое, только вычитание.

в этом случае нельзя:

Map.insert(make_pair(key,val));

потому что с:

std::map<int, int> freq;

вы говорите, что ваша карта будет иметь целое число в качестве «ключа» и целое число в качестве «значения», это не «карта пар», это просто карта, это была бы карта пар, если бы вы инициализируется как std::map > freq;

Map[Key] = Value;

если это проблема конкуренции, я рекомендую вам просто использовать массив, установить его размер на самый большой, который вам понадобится, и инициализировать его в 0 по мере необходимости.

person lcjury    schedule 03.04.2014

Когда вы используете оператор поиска [], а ключ еще не находится на карте, запись создается с использованием инициализированного значения типа. В этом случае значение, инициализированное int, инициализируется нулем, что дает начальное значение 0. Затем ++ или -- работают с этим значением.

person Mark Ransom    schedule 03.04.2014

Я знаю такие вставки (и их отличия):

Map[key] = value;

Map[key] не предназначен строго для вставок. Вы также можете присвоить это значение. Операторы postincr/postdecr изменяют эти значения в качестве побочного эффекта.

Таким образом, Map[key]++ является допустимым и делает то, что вы могли ожидать — увеличивает значение, хранящееся в Map[key]. Эквивалентно:

Map[key] = Map[key] + 1
person Brian Cain    schedule 03.04.2014