the value of "zero" in the map
Ostatnio zmodyfikowano 2021-05-08 22:23
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 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 ) ); counter = 0; } return temp_map; }
|
|
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ą: for( int temp: temp_vec ) temp_map[ temp ] ++; |
|
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 |
|
DejaVu |
» 2021-05-08 22:03:20 Mapa jest już posortowana. Wystarczy po prostu zrobić iterację od początku do końca. |
|
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) |
|
DejaVu |
» 2021-05-08 22:14:42 No to możesz np. przerzucić wyniki do 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() ); 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ć). |
|
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ą 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 ) ); 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 |
|
« 1 » |