Sortowanie wektorów struktur

Odpowiedz Nowy wątek
2014-12-29 20:32
Pochichrana
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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26
Nie zmyślaj znaczników, a korzystaj z tych istniejących; Do kolorowania składni C++ masz znaczniki &lt;code=cpp&gt; - furious programming 2014-12-29 22:00

Pozostało 580 znaków

2014-12-29 20:36
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;
 
    };
 

Pozostało 580 znaków

2014-12-29 21:25
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

edytowany 1x, ostatnio: gośćabc, 2014-12-29 21:26
Pokaż pozostałe 5 komentarzy
true, na współczesnych procesorach operacje w programie się dzieją tak szybko, że aby zauważyć różnicę w milisekundach to trzeba już pracować na dużej próbie danych; i wg. mnie w zależności od potrzeb to rozwiązanie jest nader wystarczające - gośćabc 2014-12-29 22:20
na kilku milionach rekordow vector bez problemu wyrobi sie ponizej sekundy, set niekoniecznie. Jesli planujesz wykonywac operacje add/remove/find w dowolnej kolejnosci to wtedy lepiej set. dodatkowo w setcie nie mozna takich samych elementow przechowywac wielokrotnie (da sie za to w multisecie), a w vectorze tak - krwq 2014-12-29 22:29
po co Ty mi to piszesz, ja to wszystko wiem, wszystkie argumenty za i przeciw set/vector są w linku, który podałem w jednym z powyższych komentarzy - gośćabc 2014-12-29 22:56
@gośćabc Dlaczego każdą uwagę traktujesz jako atak na Twoją osobę? - n0name_l 2014-12-29 23:55
no bo to co napisałeś nic nie wniosło do tematu, i jeszcze było odpowiedzią ze znakiem zapytania, więc musiałem coś odpowiedzieć, a no i chyba Cię nie lubię - gośćabc 2014-12-30 00:03

Pozostało 580 znaków

2014-12-29 22:10
0

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

czego nie rozumiesz, a jak chcesz pomocy to ja tylko będę wklejał angielskie linki, polskich nawet nie znam (więc lepiej znaj angielski) - gośćabc 2014-12-29 22:16

Pozostało 580 znaków

2014-12-29 22:26
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 ???

set to taki vector, któr sortuje na bieżąco, bez wywołania std::sort; co insert wszystko jest sortowane; operator< zastępuje funkcję sortującą; set wymaga, aby elementy, które trzyma posiadały operator<, bo jest to kontener, który jak już napisałem sortuje - gośćabc 2014-12-29 22:41

Pozostało 580 znaków

2014-12-29 22:28
0

http://ideone.com/fM60GV


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2014-12-29 22:29
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-29 22:39
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...

edytowany 2x, ostatnio: Vanilka, 2014-12-29 22:41

Pozostało 580 znaków

2014-12-29 22:42
0

A po takim uproszczeniu:

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

jasne?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-29 22:58
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 ?

Pozostało 580 znaków

2014-12-29 23:02
0

wskaźnik jest obiektem, a referencja nim nie jest, to jest główna różnica

a ta pętla to jest c++11 ranged for;

dla każdego elementu (e) z (:) kontenera wybiera value czyli w tym przypadku obiekty typu A i operuje sobie na nim

edytowany 1x, ostatnio: gośćabc, 2014-12-29 23:04
Pokaż pozostałe 2 komentarze
ale kod zaproponowany zostal w nim napisany, przez co jest dla mnie niezrozumialy. - Vanilka 2014-12-29 23:23
nie rozumiem jakie jest pytanie zatem, nie wiesz jak iterować po elementach vector? - gośćabc 2014-12-29 23:28
iterowac wiem.. jestem w stanie stworzyc iterator i porownac go z elementem. i zamienic dane... Troche nawet z tym kombinowalam wcozraj. ale chyba rpzekombinowalam bo probowalam uzyc erase() i insert() i to juz nie dziala. - Vanilka 2014-12-29 23:41
zadaj pytanie jako normalny post, bo wciąż nie wiem w czym problem, gdzie nie działa - gośćabc 2014-12-29 23:43
ok .. jeszcze rozkminie.. napisze co zrobilam i na gotowym przeze mnie kodzie bedziemy szukac rozwiazania.. dziekuje za cierpliwosc :) - Vanilka 2014-12-29 23:51

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