2012-02-21 3 views
20

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

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

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

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

ответ

5

Вы никогда не меняли 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; 

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

+0

Большое спасибо, работает отлично. – Sh0gun

+0

Для большой карты должно быть быстрее использовать функцию члена карты (возможно, в сочетании с бинарным поиском), std :: map :: upper_bound? –

2

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

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

55

Вы можете использовать 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'; 
+0

Привет, Роб, как понять функцию? Это перегрузка оператора []? [] (const пара & p1, const пара & p2) { return p1.second thinkhy

+0

http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B_.28since_C.2B.2B11.29 –

+1

Shouldn 't int в паре <..> be const, т. е. пара ? – thomasa88

2

Как кто-то привыкли к использованию подталкивания библиотек, альтернативу, используя анонимную функцию, предложенную Rob является следующая реализация 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))); 
-1

Beter использует внутреннюю карту компаратора :: 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 
+7

Код ниже не работает. auto p = std :: max_element (freq.begin(), freq.end(), freq.value_comp()); Начиная с> std :: map :: value_comp Возвращает объект сравнения, который можно использовать для > сравнить два элемента, чтобы получить, будет ли ключ первого отправляться > перед вторым. Таким образом, p будет указывать на последний элемент на карте. – ivan2kh

+2

Это неправильный компаратор. См. Http://www.cplusplus.com/reference/map/map/value_comp/ – mmdanziger

+0

Совершенно неправильно! Исправьте или удалите. – juanchopanza

1

Мы можем повторно использовать ключ или, объекты значение компаратора в соответствии с требованиями в месте компаратора 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 

==

3

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

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; 

Выходы: Ь => 2

+0

Спасибо! Это ответ, который полезен людям, которые ищут готовую рабочую функцию! – AlwaysLearning

0

Мы можем легко сделать это с помощью функции 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; 
} 
Смежные вопросы