C ++ Помощь в поиске максимального значения на карте - PullRequest
35 голосов
/ 21 февраля 2012

Я делал основную программу, чтобы найти максимум, минимум, медиану, дисперсию, режим и т. Д. Вектора.Все шло нормально, пока я не добрался до режима.

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

Вот кусок кода, который доставляет мне столько хлопот.

map<int,unsigned> frequencyCount;
// This is my attempt to increment the values
// of the map everytime one of the same numebers 
for(size_t i = 0; i < v.size(); ++i)
    frequencyCount[v[i]]++;

unsigned currentMax = 0;
unsigned checked = 0;
unsigned maax = 0;
for(auto it = frequencyCount.cbegin(); it != frequencyCount.cend(); ++it )
    //checked = it->second;
    if (it ->second > currentMax)
    {
        maax = it->first;
    }
    //if(it ->second > currentMax){
    //v = it->first

cout << " The highest value within the map is: " << maax << endl;

Всю программу можно увидеть здесь.http://pastebin.com/MzPENmHp

Ответы [ 9 ]

84 голосов
/ 21 февраля 2012

Вы можете использовать std::max_element, чтобы найти наибольшее значение карты (для следующего кода требуется C ++ 11):

std::map<int, size_t> frequencyCount;
using pair_type = decltype(frequencyCount)::value_type;

for (auto i : v)
    frequencyCount[i]++;

auto pr = std::max_element
(
    std::begin(frequencyCount), std::end(frequencyCount),
    [] (const pair_type & p1, const pair_type & p2) {
        return p1.second < p2.second;
    }
);
std::cout << "A mode of the vector: " << pr->first << '\n';
11 голосов
/ 21 февраля 2012

Вы никогда не меняли currentMax в своем коде.

map<int,unsigned> frequencyCount;
for(size_t i = 0; i < v.size(); ++i)
    frequencyCount[v[i]]++;

unsigned currentMax = 0;
unsigned arg_max = 0;
for(auto it = frequencyCount.cbegin(); it != frequencyCount.cend(); ++it ) }
    if (it ->second > currentMax) {
        arg_max = it->first;
        currentMax = it->second;
    }
}
cout << "Value " << arg_max << " occurs " << currentMax << " times " << endl;

Еще один способ найти режим - это отсортировать вектор и пройти по нему один раз, отслеживая индексы, где значения меняются.1005 *

9 голосов
/ 22 января 2016

Вот шаблонная функция, основанная на превосходном ответе Роба выше.

template<typename KeyType, typename ValueType> 
std::pair<KeyType,ValueType> get_max( const std::map<KeyType,ValueType>& x ) {
  using pairtype=std::pair<KeyType,ValueType>; 
  return *std::max_element(x.begin(), x.end(), [] (const pairtype & p1, const pairtype & p2) {
        return p1.second < p2.second;
  }); 
}

Пример:

std::map<char,int> x = { { 'a',1 },{ 'b',2 },{'c',0}}; 
auto max=get_max(x);
std::cout << max.first << "=>" << max.second << std::endl; 

Выходы: b => 2

2 голосов
/ 05 февраля 2013

Поскольку кто-то привык использовать библиотеки boost, альтернативой использованию анонимной функции, предложенной Робом, является следующая реализация std :: max_element:

std::map< int, unsigned >::const_iterator found = 
        std::max_element( map.begin(), map.end(),
                         ( boost::bind(&std::map< int, unsigned >::value_type::second, _1) < 
                           boost::bind(&std::map< int, unsigned >::value_type::second, _2 ) ) );
2 голосов
/ 21 февраля 2012

вы почти у цели: просто добавьте currentMax = it->second; после maax = it->first;

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

1 голос
/ 20 июня 2017

Мы можем легко сделать это, используя функцию max_element ().

Фрагмент кода:


#include <bits/stdc++.h>
using namespace std;

bool compare(const pair<int, int>&a, const pair<int, int>&b)
{
   return a.second<b.second;
}

int main(int argc, char const *argv[])
{
   int n, key, maxn;
   map<int,int> mp;

   cin>>n;

   for (int i=0; i<n; i++)
   {
     cin>>key;
     mp[key]++;
   }

   maxn = max_element(mp.begin(), mp.end(), compare)->second;

   cout<<maxn<<endl;

   return 0;
 }
1 голос
/ 27 ноября 2013

Мы можем повторно использовать ключевые или, оценивать объекты компаратора в соответствии с требованиями вместо api компаратора, извлекая минимальные / максимальные / диапазоны для любого итератора STL.

http://www.cplusplus.com/reference/map/multimap/key_comp/ http://www.cplusplus.com/reference/map/multimap/value_comp/

==

Пример:

// multimap::key_comp
#include <iostream>
#include <map>

int main ()
{
  std::multimap<char,int> mymultimap;

  std::multimap<char,int>::key_compare mycomp = mymultimap.key_comp();

  mymultimap.insert (std::make_pair('a',100));
  mymultimap.insert (std::make_pair('b',200));
  mymultimap.insert (std::make_pair('b',211));
  mymultimap.insert (std::make_pair('c',300));

  std::cout << "mymultimap contains:\n";

  char highest = mymultimap.rbegin()->first;     // key value of last element

  std::multimap<char,int>::iterator it = mymultimap.begin();
  do {
    std::cout << (*it).first << " => " << (*it).second << '\n';
  } while ( mycomp((*it++).first, highest) );

  std::cout << '\n';

  return 0;
}


Output:
mymultimap contains:
a => 100
b => 200
b => 211
c => 300

==

0 голосов
/ 14 февраля 2019

Вы, ребята, пишите слишком много.Это можно сделать в несколько строк, вот полный рабочий фрагмент:

#include <iostream>
#include <algorithm>
#include <map>
int main() {
    std::map<char,int> x = { { 'a',1 },{ 'b',2 },{'c',0} };
    std::map<char,int>::iterator best
        = std::max_element(x.begin(),x.end(),[] (const std::pair<char,int>& a, const std::pair<char,int>& b)->bool{ return a.second < b.second; } );
    std::cout << best->first << " , " << best->second << "\n";
}
0 голосов
/ 14 октября 2013

Лучше использовать внутреннюю карту компаратора :: value_comp ().

Например:

#include <algorithm>
...
auto max = std::max_element(freq.begin(), freq.end(), freq.value_comp());
std::cout << max->first << "=>" << max->second << std::endl

выведет:

Key => Value
...