pekfos |
» 2014-05-26 15:11:41 nie porównywałem usuwania z listy z usuwania z vectora. |
A z czym? No fakt, z niczym, bo to 'generalnie nie jest najwydajnieszy algorytm' i tyle.. W takim razie co jest wydajne, skoro usuwanie z listy w czasie stałym takie nie jest..? Proponuję najpierw mieć pojęcie, o czym się mówi, a potem ew o tym mówić. 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. |
Listy zwykle się używa, by elementy nie zmieniały pozycji w pamięci, gdy manipuluje się kontenerem. Analogicznym rozwiązaniem jest vector<> wskaźników. cache missy będą występowały w obu przypadkach. |
|
kamilall234 Temat założony przez niniejszego użytkownika |
» 2014-05-28 01:11:47 Dzięki za odpowiedzi z góry, mogłem uprzedzić bo już sobie poradziłem pare dni temu. Zbliżam się już ku końcowi mojej gry, jednak zauważyłem że nie działa mi poprawnie Transakcja. Nie dodaje sie kasa na koncie odbierajacego i nie ubywa na koncie sprzedajacego. Wyglada to tak: class Transakcja { private: int wartosc; public: Transakcja() { }; int zwrot_transakcji(); void wymiana_graczy( Gracz placacy, Gracz, int gotowka ); void wymiana_bank( Gracz * pierwszy, Bank * drugi, int gotowka ); void pozyczka(); ~Transakcja() { }; };
void Transakcja::wymiana_graczy( Gracz placacy, Gracz dostajacy, int gotowka ) { cout << "Tutaj transakcja" << endl; placacy.zaplac( gotowka ); dostajacy.dostan_kase( gotowka ); cout << "Koniec transakcji" << endl; }
Ta klasa przeprowadza transakcje. Jest ona skojarzona z klasą Gracz i klasa Rozgrywka (klasy są oskracane dla przejrzystosci) class Gracz { private: int numer_gracza; int konto; . vector < Zakupione_Gracza *> karty_gracza; Transakcja * wplyw_kasy; public: Gracz( int, int ); int rzut_koscia( Kosc * ); int ruch_gracza( int, Kosc * ); void kup_dzialke( int, int, int ); int zaplac( int ); int dostan_kase( int ); };
int Gracz::dostan_kase( int kasa ) { konto = konto + kasa; }
int Gracz::zaplac( int ile_gotowki ) { cout << "Place" << endl; cout << nazwa << endl; konto = konto - ile_gotowki; cout << konto; cout << "zaplacilem" << endl; return ile_gotowki; }
class Rozgrywka { private: Transakcja * proba; vector < Gracz > tab; Kosc * kostka; protected: public: . . . };
Po wywołaniu funkcji na dole, stany kont graczy pozostają takie same jak przed transakcja, jednak w trakcie w (**) konto jest pomniejszone, ale tak jakby nie zapisuje tego do vecotra tab. Transakcja * nowa; nowa->wymiana_graczy( tab[ 1 ], tab[ 0 ], gotowka );
|
|
Moorfox |
» 2014-05-28 01:20:13 Zaraz doczytam, ale zdaje mi się, że wywołujesz funkcje poprzez wskaźnik do której nie jest przypisany żaden adres obiektu ? class Rozgrywka { private: Transakcja * transakcje; vector < Gracz > tab; Kosc * kostka; protected: public: Gracz getGracz( int numer ) { return tab[ numer - 1 ]; } Transakcja getTrans() { return transakcje; } Rozgrywka() { transakcje = new Transakcja; } ~Rozgrywka() { delete transakcje; } };
int main() { Rozgrywka nowa; nowa.getTrans()->wymiana_graczy( nowa.getGracz( 1 ), nowa.getGracz( 2 ), 500 ); return 0; }
Nie jestem pewien jak ty to widzisz tzn gdzie wywolujesz poszczegolne funkcje |
|
kamilall234 Temat założony przez niniejszego użytkownika |
» 2014-05-28 01:32:49 Wywołanie to jest w Rozgrywce. |
|
Moorfox |
» 2014-05-28 01:34:01 To jeszcze miedzyinnymi void Transakcja::wymiana_graczy( Gracz & placacy, Gracz & dostajacy, int gotowka )
|
|
kamilall234 Temat założony przez niniejszego użytkownika |
» 2014-05-28 01:38:24 Ale wstyd :D zapomniałem o &. Teraz wszystko ok. Dzieki wielkie ! |
|
1 « 2 » |