Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

the value of "zero" in the map

Ostatnio zmodyfikowano 2021-05-08 22:23
Autor Wiadomość
nanoant20
Temat założony przez niniejszego użytkownika
the value of "zero" in the map
» 2021-05-08 18:55:52
program losuje (dla testu) 10 liczb z zakresu od 1 do 4
zapisuje je do kontenera vector i sortuje
tak posortowany kontener przesyłam do poniższej funkcji
Funkcja ma za zadanie zliczać ilość wystąpień każdej liczby w tym zbiorze
i umieszczać w kontenerze std::map
przy wyświetlaniu mapy pojawia mi się że wartość 0 wystąpiło 0 razy
(nie za każdym razem) finalnie tego zera nie powinno tam być
poniżej funkcja, która jest odpowiedzialna za wstawianie wartości do mapy

C/C++
std::map < int, int > initMap( vector < int > temp_vec )
{
   
map < int, int > temp_map;
   
int value { 0 }, bis { 0 }, temp { 0 }, counter { 0 };
   
int current { 0 }, previous { 0 };
   
for( unsigned int i = 0; i < temp_vec.size(); ++i )
   
{
       
temp = temp_vec[ i ];
       
current = temp_vec[ i ];
       
previous = temp_vec[ i + 1 ];
       
for( unsigned int j = 0; j < temp_vec.size(); ++j )
       
{
           
if( temp_vec[ j ] == temp )
           
{
               
counter++;
           
}
           
if( current < previous )
           
{
               
bis = counter;
               
value = temp;
           
}
        }
       
temp_map.insert( pair < int, int >( value, bis ) );
       
//temp_map.emplace(value, bis);
       
counter = 0; //resetujemy licznik
   
}
   
   
return temp_map;
}
 
P-178559
pekfos
» 2021-05-08 21:02:47
Funkcja ma za zadanie zliczać ilość wystąpień każdej liczby w tym zbiorze
Nie rozumiem co chciałeś osiągnąć taką implementacją. To jest cały potrzebny algorytm, nawet ma lepszą złożoność obliczeniową:
C/C++
for( int temp: temp_vec )
   
 temp_map[ temp ] ++;
P-178560
nanoant20
Temat założony przez niniejszego użytkownika
» 2021-05-08 21:29:27
Dzięki @pekfos algorytm, który podałeś działa tak jak tego oczekiwałem D
//edit
Jeszcze jedno pytanie, chciałbym posortować tą mapę po wartościach
to lepiej użyć by było multimap
P-178561
DejaVu
» 2021-05-08 22:03:20
Mapa jest już posortowana. Wystarczy po prostu zrobić iterację od początku do końca.
P-178562
nanoant20
Temat założony przez niniejszego użytkownika
» 2021-05-08 22:07:48
@DejaVu tak jest posortowana ale po kluczu
jest np tak
2 wystapilo 3 razy
3 wystpailo 2 razy
4 wystapilo 5 razy
a chce żeby było posortowane po liczbie wystąpięń (czyli po wartości)
 
P-178563
DejaVu
» 2021-05-08 22:14:42
No to możesz np. przerzucić wyniki do
C/C++
std::vector < std::pair < int, int >> wyniki;
wyniki.reserve( temp_map.size() );
for( const auto & item: temp_map )
   
 wyniki.push_back( std::make_pair( item.second, item.first ) );

std::sort( wyniki.begin(), wyniki.end() ); //posortowane rosnąco

Jak chcesz mieć wyniki malejąco to albo wypisuj tablicę od końca albo dodaj funktor do std::sort, który posortuje malejąco (łatwo wygooglać).
P-178564
nanoant20
Temat założony przez niniejszego użytkownika
» 2021-05-08 22:23:43
@DejaVu Dziękuję serdecznie za podrzucenie kodu z kontenerem vector faktycznie będzie dużo prościej niż zabawa z mulimapą

C/C++
std::vector < std::pair < int, int >> wyniki;
wyniki.reserve( temp_map.size() );
for( const auto & item: temp_map )
   
 wyniki.push_back( std::make_pair( item.first, item.second ) ); //first, second

//sortowanie po wartosci wraz z kluczem
std::sort( wyniki.rbegin(), wyniki.rend(),[ ]( auto & left, auto & right )
{
   
return left.second < right.second;
} );
cout << endl;
for( auto const & pair: wyniki )
{
   
cout << pair.first << " wystopilo " << pair.second << endl;
}

@@DejaVu i @pekfos jeszcze raz dziękuję za naprowadzenie mnie i za pomoc
P-178565
« 1 »
  Strona 1 z 1