Probleme mit lists
-
Hallo Leute,
meine Klasse sieht so aus:// Header class A{ public: std::list<COORDINATE> *sp; std::list<COORDINATE> *mp; bool A::set_sp_inlist(int pos, COORDINATE new_coo) ...// CPP
bool A::set_sp_inlist(int pos, COORDINATE new_coo){ this->sp->insert(pos,new_coo); return true; }Kurz gesagt möchte ich das beim aufruf set_sp_inlist eine koordinate an einer vorgegeben position abgespeichert wird. beim übersetzen bekommen ich diesen fehler:
error C2664: 'std::list<_Ty>::_Iterator<_Secure_validation> std::list<_Ty>::insert(std::list<_Ty>::_Const_iterator<true>,const _Ty &)' : cannot convert parameter 1 from 'int' to 'std::list<_Ty>::_Const_iterator<_Secure_validation>'Könnte mir jemand bitte sagen was ich hier falsch mache? Bin noch nicht so fit.
-
Wie die Fehlermeldung sagt, erwartet insert als erster parameter einen Iterator und kein int.
http://www.cplusplus.com/reference/stl/list/insert/
-
BigNeal schrieb:
Wie die Fehlermeldung sagt, erwartet insert als erster parameter einen Iterator und kein int.
http://www.cplusplus.com/reference/stl/list/insert/Ja, verstehe. Wie löst man so etwas? Ich möchte aus einer weiteren Funktion der Klasse set_sp_in_lists(position,wert) aufrufen. In dieser Funktion würde der Iterator ja immer in seinem Lokal Scope untergehen oder nicht?!
-
bool A::set_sp_inlist(int pos, COORDINATE new_coo) { std::list<COORDINATE>::iterator it = this->sp->begin() + pos; this->sp->insert(it, new_coo); return true; // Wozu??? Nimm doch einfach void! }Versuchs mal so. Was hast du denn genau vor? Eventuell ist ja auch dein gesamter Ansatz nicht so glücklich.
-
kljkljkl schrieb:
Versuchs mal so. Was hast du denn genau vor? Eventuell ist ja auch dein gesamter Ansatz nicht so glücklich.
Ich habe eine wXwidgets Programm das eine Mausposition übergibt.
Diese Mausposition speicher ich im Struct COORDINATE.
Dann möchte ich diese Koordinate in eine list packen.Kann gut möglich sein dass es etwas unglücklich wird, habe derzeit nicht viel Erfahrung mit C++
-
darkfate schrieb:
meine Klasse sieht so aus:
// Header class A{ public: std::list<COORDINATE> *sp; std::list<COORDINATE> *mp; bool A::set_sp_inlist(int pos, COORDINATE new_coo) ...Wieso denn bloß? Wieso sind sp und mp Zeiger? Ist doch gar nicht nötig und verkompliziert alles nur!
darkfate schrieb:
// CPP
bool A::set_sp_inlist(int pos, COORDINATE new_coo){ this->sp->insert(pos,new_coo); return true; }Kurz gesagt möchte ich das beim aufruf set_sp_inlist eine koordinate an einer vorgegeben position abgespeichert wird. beim übersetzen bekommen ich diesen
Die Position muss als Iterator übergeben werden. Du kannst zwar aus der Ganzzahl einen Iterator erzeugen, aber das kostet eben Zeit bei einer Liste, weil man die Liste durchlaufen muss bis zur richtigen Position:
std::list<COORDINATE>::iterator it = sp->begin(); std::advance(it,pos); sp->insert(it,new_coo);Mit advance aus dem <iterator>-Header kannst Du den Iterator bestimmen. Aber im Falle einer Liste dauert das eben, weil der Listen-Iterator nur ++ und -- unterstützt (Bidirektionaler Iterator) und kein + und - (wie ein RandomAccess-Iterator).
-
std::list hat keine "Positionen", sie hat keinen random access. Du kannst nur irgendwo anfangen, z.b. bei begin() und dann vorwärts durchlaufen (oder auch rückwärts).
Bei einem std::vector kannst du an bestimmten Positionen einen Wert setzen.vectorXYZ[pos] = Coordinate;Das fügt dort aber keinen Wert ein, sondern weist dem dort vorhandenen etwas anderes zu, d.h. es gibt mindestens die Werte an Position 0 bis
pos.
Wenn du irgendwelchen "Positionen" einen Wert zuordnen möchtest, bietet sich nochstd::mapan:std::map<int,COORD> xyz; xyz[pos] = COORD(1,1); xyz[pos] = COORD(2,1); // voriger wert überschriebenWenn es mehrere Werte zu einer Position gibt, gibt es
std::multimap:std::multimap<int,COORD> xyz; xyz[pos] = COORD(1,1); xyz[pos] = COORD(2,1); // jetzt gibt es 2 Koordinaten zu pos
-
brotbernd schrieb:
std::multimap<int,COORD> xyz; xyz[pos] = COORD(1,1); xyz[pos] = COORD(2,1); // jetzt gibt es 2 Koordinaten zu posstd::multimaphat allerdings keinenoperator[], da die Schlüssel-Wert-Zuordnung nicht mehr eindeutig ist.Zum Einfügen kann man
insert()verwenden, zum Suchenequal_range().
-
äh ja das stimmt, sorry...
-
Wow, hätte nicht gedacht dass es so intensiv beantwortet wird. Danke an alle!