проверить, существует ли значение в мультикарте c ++ - PullRequest
0 голосов
/ 20 января 2019

Как узнать, что Multimap уже содержит определенное значение, и как найти общее количество элементов, содержащих один и тот же ключ?

std::multimap<float,int> obj;
obj.insert ( std::pair<char,int>('a',100) );
obj.insert ( std::pair<char,int>('a',100) );

Например, если я хочу проверить, задано ли multimap, объект уже содержит значение 100, как мне его проверить и как получить, что количество элементов, содержащих символ а, равно 2?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Это короткий код, который отвечает на оба ваших вопроса:

#include <iostream>
#include <map>

int main()
{
    // The map
    std::multimap<char,int> obj;
    obj.insert ( std::pair<char,int>('a',100) );
    obj.insert ( std::pair<char,int>('a',100) );
    obj.insert ( std::pair<char,int>('b',100) );
    obj.insert ( std::pair<char,int>('b',200) );
    obj.insert ( std::pair<char,int>('b',300) );

    // Count occurrences of a key
    std::cout << "a: " << obj.count('a') << "\nb: " << obj.count('b')
              << "\nc: " << obj.count('c') << "\n";

    // Count occurrences of a value
    int val = 100, count = 0;
    for (const auto& entry : obj)
        if (entry.second == val)
            count++;

    std::cout << "Value " << val << " occurred " << count << " times." << std::endl;
}

Я сделал карту немного больше для демонстрации, также - ваш первоначальный тип мультикарты был неправильным - вам нужно сделать ее <char, int> вместо <float, int> - она ​​скомпилировалась и «работала» из-за преобразований, но вы определенно не не хочу этого в вашей программе.

Часть, которая подсчитывает вхождение ключа, использует функцию мультикарты count, которая буквально подсчитывает вхождения данного ключа в мультикарте.

Вы можете посмотреть все доступные функции для данного контейнера и посмотреть, какая из них работает для вас, если таковые имеются. Я использую веб-сайт https://en.cppreference.com/w/, который я предпочитаю веб-сайту http://www.cplusplus.com/. Таким образом, для мультикарты на этом веб-сайте вы получаете список всего, что напрямую связано с мультикартой. Одним из преимуществ поиска является то, что вы также увидите новые опции в новейших стандартах. Наконец, на этом веб-сайте часто имеется встроенный раздел компилятора / кода в разделе документации, который вы можете запускать и редактировать (и запускать под разными компиляторами и стандартами). Это дает возможность лучше понять функции и быстро проверить, работают ли какие-либо варианты, с которыми вы столкнулись.

Вторая часть подсчитывает вхождение заданного значения в карту - это нужно сделать «вручную», проверив каждую запись в мультикарте и ее значение. Конечно, есть и другие пути, но это для меня самое простое. Он использует более рекомендуемый диапазон для цикла с постоянными ссылками (поскольку записи, через которые он проходит, не должны изменяться).

Это проверяет только одно фиксированное значение, но вы можете получить вхождения всех значений, создав регулярную карту с ключами, являющимися значениями из вашей мультикарты, а значениями являются их счетчики. Это не сложно и будет хорошим упражнением.

0 голосов
/ 20 января 2019

Я думаю, вы могли бы рассчитывать только std :: pair ('a', 100) элементов. Смотри http://www.cplusplus.com/reference/map/multimap/count/.

Если вы хотите сосчитать только «a» или 100, вы должны вручную выполнить итерацию всех элементов мультикарты.

...