wake-up-neo.com

C++ - Hilfe zum Ermitteln des maximalen Werts in einer Karte

Ich habe ein grundlegendes Programm gemacht, um den Maximal-, Min-, Median-, Varianz-, Modus usw. eines Vektors zu ermitteln. Alles lief gut, bis ich zum Modus kam.

So wie ich es sehe, sollte ich in der Lage sein, den Vektor zu durchlaufen, und für jede Zahl, die vorkommt, inkrementiere ich einen Schlüssel auf der Karte. Das Finden des Schlüssels mit dem höchsten Wert wäre dann derjenige, der am häufigsten vorkam. Beim Vergleich mit anderen Tasten würde ich feststellen, ob es sich um eine einzelne Antwort mit mehreren Antworten oder keinen Modus handelt. 

Hier ist der Code, der mir so viel Ärger bereitet. 

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;

Das gesamte Programm ist hier zu sehen. http://Pastebin.com/MzPENmHp

30
Sh0gun

Sie haben currentMax in Ihrem Code nie geändert.

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;

Sie können den Modus auch finden, indem Sie den Vektor sortieren und einmal durchlaufen, um die Indizes zu verfolgen, an denen sich die Werte ändern.

7
YXD

Sie können std::max_element verwenden, um den höchsten Kartenwert zu ermitteln (der folgende Code erfordert 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';
72
Robᵩ

Hier ist eine Templated-Funktion, die auf Robs hervorragender Antwort basiert. 

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;
  }); 
}

Beispiel:

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

Ausgänge: b => 2

6
daknowles

Als jemand, der daran gewöhnt ist, Boost-Bibliotheken zu verwenden, ist die folgende Implementierung von std :: max_element eine Alternative zu der von Rob vorgeschlagenen anonymen Funktion:

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
dr_g

sie sind fast da: Fügen Sie einfach currentMax = it->second; nach maax = it->first; hinzu.

aber mit einer Karte das Maximum herauszufinden, ist übertrieben: Scannen Sie einfach den Vektor und speichern Sie den Index dort, wo Sie höhere Zahlen finden: sehr ähnlich zu dem, was Sie bereits geschrieben haben, nur einfacher.

2
CapelliC

Wir können Schlüssel- oder Wertvergleichsobjekte gemäß den Anforderungen anstelle der Vergleicher-API verwenden, während min/max/Bereiche über einen STL-Iterator abgerufen werden.

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

==

Beispiel:

// 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

==

1
mav_2k

Wir können dies leicht mit der Funktion max_element () tun.

Code-Auszug :


#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
rashedcs

Ihr schreibt zu viel. Dies kann in wenigen Zeilen erfolgen, hier ist ein vollständiger Funktionsausschnitt:

#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
cosurgi