ilosć powtórzeń wyrazów w pliku

Odpowiedz Nowy wątek
2015-09-25 12:19
0

Witam Wszystkich
Potrzebuje pomocy i nie mam za bardzo pojęcia jak to ugryźć. Mianowicie program wyświetla wyniki powtórzeń, ale chciałbym posortować mapę od największej ilości powtórzeń i wyświetlić 20 wyników. poniżej kod:

    #include <iostream>  
    #include <fstream>  
    #include <sstream>  
    #include <map>  
    #include <string>  

    using namespace std;  

    class WordCounter  
    {  
    public:  
        int value;  
        WordCounter() : value( 0 ) {}  

        void operator++ (int) { value++; }  
    };  

    ostream& operator<<(ostream& st, WordCounter& wc )  
    {  
        return st << wc.value;  
    }  

    const string path = "/home/grzegorz/ownCloud/Nauka/wszib/sem6/WI/Zadania/Word Count/potop.txt";

    int main()  
    {  
        map<string, WordCounter> counter;  

        ifstream input;  
        input.open( path.c_str() );  

        if ( !input )  
        {  
            cout << "Error in opening file\n";  
            return 0;  
        }  

        string tok;       
        while ( true )  
        {  
            input >> tok;  

            if ( input )  
            {  
                counter[ tok ]++;  
            }  
            else break;       
        }  

        map< string, WordCounter,less<string> >::iterator it;  

        for ( it  = counter.begin();  
              it != counter.end();  
              it++ )  

        {  
            cout << (*it).first  
                 << "    "  
                 << (*it).second  
                 << endl;  
        }  

        return 0;  
    }   
edytowany 2x, ostatnio: mysterIIyx, 2015-09-25 12:37

Pozostało 580 znaków

2015-09-25 12:28
0

Jak nie wiesz jak to ugryźć jak wszystko wiesz :p

chciałbym posortować mapę

std::sort

od największej ilości powtórzeń

std::greater + przeładuj operator w swojej strukturze / jakaś lambda

i wyświetlić 20 wyników

prosty for</del>

Tak, w ogóle to nie wiem po co ten wrapper na int (który powinien być size_t :p), ale może masz jakiś powód (:

edytowany 3x, ostatnio: stryku, 2015-09-25 12:38
std::sort do posortowania mapy? Po wartości? - twonek 2015-09-25 12:34
A to niedouczony jestem :/ - stryku 2015-09-25 12:37

Pozostało 580 znaków

2015-09-25 12:33
0
 const string path = "[...]potop.txt";
...
cout << "Error in opening file Hamlet.txt\n";  

???

Mapa sortuje po kluczu, a nie wartości. Jak chcesz sortować po wartości to możesz np. wywalić wszystkie elementy do vectora i posortować po wartości.

Pozostało 580 znaków

2015-09-25 12:35
0

Cały problem w tym, że nie mogę używać vectora :(

Kto Ci zabrania? - X-on 2015-09-25 13:07

Pozostało 580 znaków

2015-09-25 12:36
0

Możesz używać mapy, a nie możesz vectora? WTF?

edytowany 3x, ostatnio: twonek, 2015-09-25 12:43

Pozostało 580 znaków

2015-09-25 12:37
0

No i dzięki za zwrócenie uwagi na błąd :))

edytowany 1x, ostatnio: mysterIIyx, 2015-09-25 12:38

Pozostało 580 znaków

2015-09-25 12:43
0

no niestety, takie prikaz i już

Pozostało 580 znaków

2015-09-25 12:46
0

To może to http://stackoverflow.com/ques[...]45/sorting-stdmap-using-value

Pozostało 580 znaków

2015-09-25 12:46
0

<Durne>
Stwórz sobie multimapę <int, string, greater<int>>. Leć po wszystkich elementach pierwszej mapy, dodaj je do drugiej i voilà, masz posortowane po ilości wystąpień.
</Durne>

Pozostało 580 znaków

2015-09-25 12:48
0
twonek napisał(a):

<Durne>
Stwórz sobie multimapę <int, string, greater<int>>. Leć po wszystkich elementach pierwszej mapy, dodaj je do drugiej i voilà, masz posortowane po ilości wystąpień.
</Durne>

Czy da się od razu zadać żeby wypisał tylko 20 pierwszych? W pythonie zrobiłem coś takiego i tam się udało :)

edytowany 1x, ostatnio: mysterIIyx, 2015-09-25 12:48

Pozostało 580 znaków

2015-09-25 12:57
0

Jak będziesz leciał iteratorem podczas wypisywania zapamiętaj ile ywpisałeś i zakończ pętlę jak osiągniesz 20.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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