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

<list> problem z wyświetlaniem danych

Ostatnio zmodyfikowano 2014-05-28 01:38
Autor Wiadomość
kamilall234
Temat założony przez niniejszego użytkownika
<list> problem z wyświetlaniem danych
» 2014-05-25 20:30:02
Witam. Stosuje <list> w celu stworzenia listy dwukierunkowej do posiadania kart gracza, tworzenie listy odbywie się bez problemu jednak, mam kłopot z wyświetlaniem jej.
Mam klase Gracz, która korzysta z klasy Zakupione_Gracza w celu tworzenie listy <list>:
C/C++
class Gracz
{
private:
    int numer_gracza;
    int konto;
    string kolor;
    string nazwa;
    int pozycja_na_planszy;
    int kolejka_gry;
    list < Zakupione_Gracza *> karty_gracza;
    Transakcja * wplyw_kasy;
   
public:
    Gracz( int, int );
    int rzut_koscia( Kosc * ); // rzuca koscia gracz
    int ruch_gracza( int );
    void kup_dzialke( int, int, int ); // ta funkcja kupuje się odpowiednie kart
    int zaplac( int );
    int status_konta();
    int dostan_kase();
    void wyswietl_karty();
};

Funckja, kup_dzialke() słóży do dodawania kart, wygląda tak
C/C++
void Gracz::kup_dzialke( int numer, int cena, int hipoteka )
{
    karty_gracza.push_back( new Zakupione_Gracza( numer, cena, hipoteka ) );
   
};

I teraz nie mogę wyświetli kart gracza za pomocą takiej funckji;
C/C++
void Gracz::wyswietl_karty()
{
    cout << "Gracz posiada : " << karty_gracza.size() << " kart" << endl;
    int ilosc_kart = karty_gracza.size();
    list < Zakupione_Gracza *> it;
    for( it = karty_gracza->begin(); it != lista->end(); ++it ) // tutaj jest blad
    {
        cout << "Miasto nr: " <<( * it ).numer << endl;
    }
}
Nie mogę zrozumieć na czym polega błąd, przecież int jest tego samego typu, do tego jest wskaźnikiem. Czy moze ktoś pomóc ?
Blad polega na tym, że
C/C++
base operand of '->' has non - pointer type ' list<Zakupione_Gracza*> [/cpp]
P-110860
Monika90
» 2014-05-25 20:39:32
C/C++
it = karty_gracza->begin()
it to jest lista, a przypisujesz jej iterator

C/C++
lista->end()
nie widzę nigdzie deklaracji zmiennej lista

A tak w ogóle, to z jakiego powodu używasz std::list a nie std::vector?
P-110863
michal11
» 2014-05-25 20:43:00
karty_gracza->begin()

Karty gracza to nie wskaźnik.

Mi też się wydaje, że lista to chyba nie jest odpowiednia struktura do przechowywania kart gracz.
P-110865
kamilall234
Temat założony przez niniejszego użytkownika
» 2014-05-25 20:45:55
Nie miałem innego pomysłu na przechowywanie kart gracza, za pomocą vector, rzechowuje już graczy i tworze plansze. Dlatego chciałem list.
Mam przeżucić na vector ?
W dodatku myslałem ze z <list> jest lepiej usuwać elementy niż z vectora
P-110866
Monika90
» 2014-05-25 20:54:31
Nie, no jak chcesz to sobie używaj listy, choć argument
za pomocą vector, przechowuje już graczy i tworze plansze. Dlatego chciałem list.
 jest dość dziwny.

W dodatku myslałem ze z <list> jest lepiej usuwać elementy niż z vectora
dla małej ilości elementów pewnie nie zauważysz różnicy w wydajności między vectorem a listą
P-110869
michal11
» 2014-05-25 21:26:48
za pomocą vector, przechowuje już graczy i tworze plansze.

Ten argument nie jest dziwny tylko beznadziejny. Czyli jak masz za dużo intów w programie to też musisz się przerzucić na long ? Po to stworzono kilka struktur danych aby korzystać z nich według ich przeznaczenia. Generalnie usuwanie elementów z listy nie jest najwydajniejszym algorytmem.
P-110873
ison
» 2014-05-25 23:34:24
Generalnie usuwanie elementów z listy nie jest najwydajniejszym algorytmem.
?

Generalnie usuwanie z listy jest szybsze albo tak samo szybkie jak usuwanie z vectora.
Z teoretycznego punktu widzenia usunięcie elementu z listy to czas stały O(1), z vectora czas liniowy O(n), gdyż wszystkie kolejne elementy muszą być przesunięte o 1 pozycję w lewo. Jeśli kolejność elementów nie gra roli, to można używać vectora, a przy usuwaniu i-tego elementu zamienić go z ostatnim i usunąć ostatni element w czasie stałym O(1).
Za użyciem vectora zamiast listy przemawia jednak inny argument, zwłaszcza wtedy, gdy częściej iteruje się po kontenerze, aniżeli usuwa/dodaje do niego elementy. Iterowanie po liście = same cache missy, każdy element listy to osobny blok pamięci w losowym miejscu. Vector to ciągły blok pamięci.
Aczkolwiek dla tak małej ilości danych nie ma to żadnego znaczenia, więc i tak używa się najwygodniejszego kontenera, a nie najszybszego.
P-110880
michal11
» 2014-05-25 23:47:21
@ison nie porównywałem usuwania z listy z usuwania z vectora.
P-110881
« 1 » 2
  Strona 1 z 2 Następna strona