wert auf iterator addieren funktioniert nicht :(
-
SDL_Button* SDL_Dropdown::getButton(int index) { std::list<SDL_Button>::iterator i = ddButtons.begin()+index; return &(*i); }->
--------------------Konfiguration: PixGraph - Win32 Debug--------------------
Kompilierung läuft...
SDL_Dropdown.cpp
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'clas
s std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'clas
s std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'clas
s std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'clas
s std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'cl
ass std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'cl
ass std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'cl
ass std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : Vorlagenargument fuer 'const class std::basic_string<_E,_Tr,_A> &' von 'cl
ass std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const _E,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fuer 'const ' von 'class std::list<class SDL_Button,class s
td::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const _E *,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fuer 'const *' von 'class std::list<class SDL_Button,cla
ss std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fuer 'const class std::ba
sic_string<_E,_Tr,_A> &' von 'class std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fuer 'const class std::ba
sic_string<_E,_Tr,_A> &' von 'class std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fuer 'const class std::ba
sic_string<_E,_Tr,_A> &' von 'class std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fuer 'const class std::ba
sic_string<_E,_Tr,_A> &' von 'class std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : Vorlagenargument fuer '' von 'class std::list<class SDL_
Button,class std::allocator<class SDL_Button> >::iterator' konnte nicht hergeleitet werden
E:\Uni\code\PixGraph\SDL_Dropdown.cpp(20) : error C2676: Binaerer Operator '+' : 'class std::list<class SDL_Button,class std::allocator<class SDL_Button> >::iterator' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinierten
Operator geeigneten Typ nicht
Fehler beim Ausführen von cl.exe.PixGraph.exe - 16 Fehler, 0 Warnung(en)
verstehe ich ned

-
list<T>::iterator ist kein random iterator. geht also nicht.
zum iteratieren in groesseren schritten gibts aehm glaub heisst 'advance' oder so.Meep Meep
-
Bei da Vorsicht geboten ist. advance macht nix anderes als so oft vorrücken wie man ihm sagt. Das heißt es wird leicht sehr langsam. Wenn Du index-zugriff brauchst, ist std::list nicht die richtige Wahl.
-
Jester schrieb:
Bei da Vorsicht geboten ist. advance macht nix anderes als so oft vorrücken wie man ihm sagt. Das heißt es wird leicht sehr langsam. Wenn Du index-zugriff brauchst, ist std::list nicht die richtige Wahl.
brauch ich im normalfall nicht, da man selten auf die buttons per index zugreifen muss.
thx
-
Du könntest trotzdem std::vector oder std::deque nehmen, ist meist besser als std::list.
std::list ist IMHO der Container den man am seltensten braucht.
-
warum?Was macht std::list zum schlechteren Container?
-
std::list finde ich eigentlich sehr praktisch. Sein vorteil, man kann überall in O(1) Zeit elemente rauswerfen, und neue einfügen, das macht ihn zum idealen Datentyp, um Objekte einer Partikelengine oder Änliches zu speichern. Vector kann da imho nicht mithalten.
Und dass der Vector hinten in konstanter Zeit elemente anfügen kann ist auch nur halb wahr, denn es handelt sich sowei ich weiß intern um ein array, dass wenn die Größe nicht mehr ausreicht den reservierten Speicherbereich verdoppelt, und alles kopiert, das hat dann im Durchschnitt eine konstante Laufzeit, aber bestimmt nicht bei jedem Zugriff gleich.
-
Woher kommt denn der Index? Ist es nicht im Bereich des möglichen, dort stattdessen einen Iterator zu generieren?
-
Krux schrieb:
std::list finde ich eigentlich sehr praktisch. Sein vorteil, man kann überall in O(1) Zeit elemente rauswerfen, und neue einfügen, das macht ihn zum idealen Datentyp, um Objekte einer Partikelengine oder Änliches zu speichern. Vector kann da imho nicht mithalten.
std::list ist in dem Fall "schnell", aber eben leider nicht schnell. Ich meine O(1) kann 1 nanosekunde heissen oder 2 Stunden. O(1) ist eben nicht gleich O(1).
Gerade für eine Partikelengine (wo die "Identität" der Partikel meist nicht wichtig ist) würde ich *niemals* eine std::list verwenden sondern immer einen std::vector. Zum Rauswerfen von Partikeln swappt man die einfach mit dem letzten Element und macht dann ein pop_back(). Schneller gehts kaum.
Wenns aus irgendeinem Grund trotzdem eine eigene Liste sein soll/muss, dann eine eigene "intrusive list" - die sind nämlich wirklich schnell :^).Und dass der Vector hinten in konstanter Zeit elemente anfügen kann ist auch nur halb wahr, denn es handelt sich sowei ich weiß intern um ein array, dass wenn die Größe nicht mehr ausreicht den reservierten Speicherbereich verdoppelt, und alles kopiert, das hat dann im Durchschnitt eine konstante Laufzeit, aber bestimmt nicht bei jedem Zugriff gleich.
Wenn man den std::vector nicht die ganze Zeit zerstört und neu anlegt ist das egal da irgendwann mal die max. Grösse erreicht ist (meist recht bald), und ab dem Moment wird garkeine Speicheranforderung mehr gemacht und nixmehr rumkopiert.
Was mich an std::list stört: es wird (üblicherweise) pro Element eine Speicheranforderung gemacht. Ohne einen eigenen Allocator zu übergeben ist das oft tödlich für die Performance. Das tolle an std::vector ist ja gerade dass sich dieser den Speicher "merkt" und nichtmehr hergibt.
Wenn man natürlich die speziellen Features von std::list unbedingt braucht und nicht drum herum arbeiten kann (wie eben swap+pop_back statt erase mitten in einem std::vector), dann soll man natürlich auch std::list verwenden.
Dass std::list der Container ist den ich am seltensten brauche ist aber einfach ein Erfahrungswert. Natürlich ist das abhängig von der Art der Programme die man schreibt.
-
