С++ Помогите найти максимальное значение на карте
Я делал базовую программу, чтобы найти максимальную, минимальную, медианную, дисперсию, режим и т.д. вектора. Все прошло нормально, пока я не добрался до режима.
Как я вижу это, я должен иметь возможность прокручивать вектор, и для каждого числа, которое происходит, я увеличиваю ключ на карте. Нахождение ключа с наивысшим значением было бы тем самым самым большим. Сравнение с другими ключами подскажет мне, если это один или несколько вариантов ответа.
Вот кусок кода, который вызывал у меня столько проблем.
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
Ответы
Ответ 1
Вы никогда не меняли 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;
Другой способ найти режим - сортировать вектор и прокручивать его один раз, отслеживая индексы, в которых значения меняются.
Ответ 2
Вы можете использовать std::max_element
, чтобы найти максимальное значение карты (для следующего кода требуется С++ 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';
Ответ 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;
Выходы: b = > 2
Ответ 4
вы почти находитесь: просто добавьте currentMax = it->second;
после maax = it->first;
но с использованием карты для определения max является излишним: просто сканируйте вектор и сохраните индекс, в котором вы найдете более высокие числа: очень похоже на то, что вы уже писали, просто проще.
Ответ 5
Как кто-то, привыкший использовать библиотеки boost, альтернативой использованию анонимной функции, предложенной 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 ) ) );
Ответ 6
Мы можем повторно использовать ключевые или объекты сравнения объектов в соответствии с требованиями вместо компаратора api, получая min/max/диапазоны по любому итератору 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
==
Ответ 7
Мы можем легко сделать это, используя функцию 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;
}
Ответ 8
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