Sortowanie wektorów struktur

0

Witam,

Mam problem z sortowaniem, ktory nie tyle dotyczy skryptu, ktory nie dziala, a problemu "jak mam sie za to zabrac"..

Otoz, w moim programie stworzylam plik na Tablice Wynikow.
Zeby go nieco uchronic przed recznym poprawianiem i uniknac zlego wyswietlania chce aby moj program wczytywal te zawartosc do pliku i sprawdzil czy jest wlasciwie posortowana. Potem wyselekcjonowal to co powinien .. i wyswietlil na ekran...

plik ma zawierac 3 kolumny danych. Imie gracza, punkty, oraz poziom

W tym celu stworzylam sobie strukture

struct WG
{
    string nazwaGracza;
    int punktyWG;
    int poziomWG;
};

te strukture wczytuje do kontenera. i z pliku zczytuje odpowiednie dane. Do tego momentu jest wszystko cacy :)

docelowo chce aby wyniki byly wyswietlane dla kazdego poziomu osobno.

Czy moge to posegregowac w ramach 1 tablicy, czy musze dane z "duzej " tablicy skopiowac do 5 mniejszych tablic ( mam 5 poziomow), czy moze jest jakis inny lepszy sposob na rozwiazanie problemu ??

P.S nie mam kompilatora c++11 wie ci lambda sie nie pobawie... prosze o pomoc jak sie za to zabrac.

Probowalam zrobic to metoda babelkowa... ale dziwnie sie ten vector zachowuje funkcje.

Moj pomysl byl taki aby porownac, wpisac do zmiennej testowej .. potem usuwac elementy i w ich miejsce wkladac nowe. Niestety uzywajac erase() lub insert() debugger zwraca blad ze nie sa to elementy struktury...

zamiana znacznika [code] na <code class="cpp"> - @furious programming

0

Zalozylam konto..

przepisze te strukture, zeby nie bylo :
Powiedzmy ze do celow testowych niech wyglada tak

 
    struct WG
    {
        string name;
        int points;
        int level;

    };

0

użyj std::set i operator<

#include <iostream>
#include <set>

struct A
{
    std::string name;

    int data;

    bool operator<(A const& o) const {
        return name < o.name ? true : name == o.name ? data < o.data ? true : false : false;
    }
};

int main()
{
    std::set<A> s;
    s.insert(A { "A", 3 });
    s.insert(A { "Z", 1 });
    s.insert(A { "B", 1 });
    s.insert(A { "A", 1 });

    for(auto const& e : s) {
        std::cout << e.name << " " << e.data << std::endl;
    }
}

chyba nie pomyliłem się w funkcji operatora

http://melpon.org/wandbox/permlink/d1kXtmECWwywBOZv

edit:
post ma na celu pokazać jak można posortować, nie wczytywałem się w nic więcej

0

eeee no chyba skrot myslowy byl za duzy.. bo niestety nie bardzo jestem w stanie to rozkminic....

0

i tu rodzi sie problem bo ja znam francuski :D

to znaczy.. poki co jestem na tym etapie n00bostwa, ze latwiej rozumiem programy ktore maja nazwy zmiennych "opisowe"...

twoj kod zawiera wiele elementow, ktore gdzies tam pojedynczo rozumiem, ale jak sa w calosci to tak jakby bylo to napisane po chinsku :D.

czy z moim pomyslem czyli struktura wlozona do vectora nie daloby sie tego rozwiazac ???

0

Przykład od @gośćabc jest nieco nieoptymalny zaś krótki. Zobacz przykład funkcji sort w dokumentacji tam jest dłuższy ale prostszy kod.

0

no juz zaczyna byc nieco lepiej... ale nie rozumiem tej czesci...

WG() {}
    WG(const string& name, int points, int level)
      : name(name), points(points), level(level) {}
 
   
 bool operator<(WG const& o) const {
    	// zwracasz true jesli obiekt "*this" ma wystepowac przed obiektem "o" po posortowaniu
        return name < o.name || (name == o.name && points < o.points);

 

program nie musi byc zbyt opytymalny, gdyz docelowo tablica ma zawierac 50 elementow, wiec jakie by to sortowanie nie bylo, czasy beda male. Oczywiscie moze sie zdarzyc ze uzytkownik wpisze do pliku wiecej rekordow ( zeby oszukac program) ale i tak bede wybierac z nich tylko 50.. wiec sortowania bede musiala miec 2.. pierwsze ktore mi wyluska poziomy.. a nastepnie posortuje punkty w ramach poziomow...

0

A po takim uproszczeniu:

bool operator<(WG const& o) const { return name!=o.name?name<o.name:points<o.points; }

jasne?

0

wstyd przyznac ale dalej nie...

sam ten zapis :

 
return name!=o.name?name<o.name:points<o.points;

jest znajomy.. chociaz sama nigdy tego nie uzywam to przypomina mi to

(warunek) ? (wyrażenie, gdy warunek jest prawdziwy) : (wyrażenie, gdy warunek jest fałszywy)
wiec zakladam ze to wlasnie to.

aha tutaj tez jest czesc niejasna

 
    for(auto const& e : s) {
        std::cout << e.name << " " << e.data << std::endl;

wczesniej pojawilo sie o ... tutaj jest e....

i wciaz mam problem ze zrozumieniem roznicy wskaznika od referencji... dla mnie to ciagle jest to samo.... mam kilka podrecznikow do C++... ale jakos nie bardzo a w tym zapisie powyzej tym bardziej juz nie kumam.. w tym drugim kodzie po co tam jest dwukropek ?

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