Как определить, существует ли значение в карте в C ++ - PullRequest
0 голосов
/ 23 ноября 2018

Я понимаю, что std :: map - это пары (Key, Value).

Я хочу выполнить поиск по значениям карты.Допустим, я хочу найти самое высокое значение среди значений в std :: map.Как я могу это сделать ?Например, позвольте мне рассмотреть такую ​​карту:

Джон -> 100

Джеффри -> 200

Кришна -> 147

Я думаю, что это будет похоже на это, но я не уверен.

 for (auto it=m.begin(); it!=m.end(); it++)
    { 
       if (it->second == 500)
          { 
             cout << "Found"; 
          }
        else { 
             continue;}
   }

Вместо итерации по std :: map, есть ли другой встроенный метод, с помощью которого я могу проверить, существует ли значениев std :: map с O (1) сложность времени?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Q1: Как проверить, существует ли значение в хэш-карте?

Вам нужно пройти через и проверить, существует ли такой элемент.Вы можете использовать `std :: find_if () с лямбдой или делать это через цикл.Если вы делаете это довольно часто, вы также можете индексировать значения (см. Ниже)

Q2: Как перебрать все значения на карте и найти самое большое или самое маленькое значение?

Опять вы перебираете контейнер и находите его, или вы можете использовать std::max_element() или std::min_element() с лямбдой.Хотя, если вам нужен доступ к значениям в отсортированном порядке, вы можете рассмотреть возможность использования boost::multimap, который позволит получить доступ к данным с использованием хешированного индекса по имени и предоставить отсортированный или хешированный индекс (ы) для значений, хотя вам следуетзнать цену каждого добавленного индекса.

0 голосов
/ 23 ноября 2018

Для второго вопроса используйте:

std::map<std::string, int> foo = {{"John",100},{"Jeffrey",200},{"Krishna",147}};
std::cout << std::max_element(foo.begin(), foo.end(), [](const auto& p1, const auto& p2){return p1.second < p2.second;})->first;
std::cout << std::min_element(foo.begin(), foo.end(), [](const auto& p1, const auto& p2){return p1.second < p2.second;})->first;

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

...