Zliczanie elementów w 'map' i wyświetlanie najpopularniejszego

0

Muszę znaleźć najczęściej występujący element w zbiorze.
Próbowałem coś takiego : (wycinek kodu)

 
  while(dane1.good())
    	{
        dane1 >> tab[i];
        i++;
        popular[tab[i]]++;
    	}

    int wystapienia=0;
    int najpopularniejszy=0;
    for(map<int,unsigned>::iterator it=popular.begin(); it!=popular.end(); it++)
    	{
        if(it->second > wystapienia)
        	{
            	wystapienia=it->second;
            	najpopularniejszy=it->first;
        	}
    	}


Coś jest nie tak. Gdzie zrobiłem błąd?

0
auto mostCommon = max_element(begin(frequencyCount), end(frequencyCount), [](const auto &p1, const auto &p2){
        return p1.second < p2.second; 
});

https://ideone.com/qIIHoH

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;

int main(){
	map<char, unsigned> freqCount = {
		{'x', 5},
		{'y', 15},
		{'z', 1}
	};
	auto mostCommon = max_element(begin(freqCount), end(freqCount), [](const auto &p1, const auto &p2){
        return p1.second < p2.second; 
	});
	cout << mostCommon->first << " => " << mostCommon->second;
	return 0;
}

out

y => 15
0

Mógłbyś mi to nieco objaśnić? Nie rozumiem dokładnie co tu się dzieję.

0

otrzymujesz iterator, pod którym kryje się para klucz-wartość z mapy posiadająca największą wartość.

0

Próbowałem zrobić też tak, tzn. na 2 dodatkowych tablicach :) W 'wystapienia' dodaje 1 jeśli któryś element już wystapil, a jesli nie to daje go pod nowym indeksem, natomiast w 'element' są kolejne liczby które zliczam.

 
#include <iostream>
#include <fstream>
#include <map>
using namespace std;

int main()
{
    ifstream dane1("dane5-1.txt");
    ifstream dane2("dane5-2.txt");
    ifstream dane3("dane5-3.txt");

    int max_suma=0;
    int suma=0;
    int tab[10000];
    int element[10000];
    int wystapienia[10000];
    int i=0;
    int x,y,z;
    bool istrue=false;

    while(dane1.good())
    {
        dane1 >> tab[i];

        for(z=0; z<i; z++)
        {
            if(tab[i]==element[z])
                {
                    wystapienia[z]++;
                    istrue=true;
                }
        }

        if(!istrue)
            {
            element[i]=tab[i];
            wystapienia[i]++;
            }

        i++;
    }


//WYSZUKANIE NAJPOPULARNIEJSZEGO ELEMENTU
    int popular=0;
    int ile=0;
    for(z=0; z<i; z++)
    {
        if(wystapienia[z]>ile)
        {
            ile=wystapienia[z];
            popular=element[z];
        }
    }

   
    }

    cout << "Najpopularniejszy element dla dane5-1 : " << popular << endl;
    return 0;
}

Jest problem tego typu, że sprawdza zlicza mi tylko 4 pierwsze liczby znajdujące się w pliku. Czym może to być spowodowane?

0

Problem rozwiązany - nie ustawiałem istrue=false w każdym obrocie pętli, więc dlatego nie dodawało nowych elementów :)

0

Np . te u góry pierwszy mój post. Próbowałem tam sprawdzać który element z mapy jest największy. Nie wiem dlaczego to nie działa. Czy ktoś mógłby mi powiedzieć, co tam jest nie tak? Gdzie popełniłem błąd? Coś źle porównałem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1