Probleme mit typedef std::list<boost::any> many;
-
end zeigt hinter das letzte Element, also auf kein Gültiges element. Wenn du das versuchst zu tauschen ist ist das nicht so toll
-
Helium schrieb:
end zeigt hinter das letzte Element, also auf kein Gültiges element. Wenn du das versuchst zu tauschen ist ist das nicht so toll
merci... das hab ich dann auch rausgefunden...
hier die eine Lösung..
vector<int>::iterator first = v.begin(), last = v.end(); --last; // auf letztes Element zeigen lassen iter_swap(first, last); // Tauschaber schon komisch... hab rumgesurft und fast überall wo das erste mit dem letzten Element getauscht wird... steht die Lösung
iter_swap(first, last);
ohne das --last;
ab und zu steht auch sowas dort:
iter_swap(v.begin(),v.end()-1);
nur da kackt er gleich beim kompilieren ab... das frisst mein kompiler gar nicht...
-
UFOSWORLD schrieb:
aber schon komisch... hab rumgesurft und fast überall wo das erste mit dem letzten Element getauscht wird... steht die Lösung
iter_swap(first, last);
ohne das --last;
Bei sowas mußt du vermutlich auch gucken, wie first und last definiert sind (manche Autoren definieren Bereiche mit einschließlichen Grenzen - d.h. last zeigt auf das letzte Element und nicht dahinter).
ab und zu steht auch sowas dort:
iter_swap(v.begin(),v.end()-1);
nur da kackt er gleich beim kompilieren ab... das frisst mein kompiler gar nicht...
Ja, sowas geht auch nur mit Random Acess Iteratoren - und list<> hat "nur" bidirektionale Iteratoren.
-
iter_swap benötigt Forward-Iteratoren und sollte so auch problemlos mit list gehen. Im Josuttis ist sogar ein Beispiel damit.

-
Braunstein schrieb:
iter_swap benötigt Forward-Iteratoren und sollte so auch problemlos mit list gehen. Im Josuttis ist sogar ein Beispiel damit.

iter_swap ja, aber was ist mit dem Ausdruck "v.end()-1"...

cu André
-
list::end() liefert einen bidirektionalen Iterator auf eine Position hinter dem letzten Element. Es sollte also gehen. Obwohl mir, ehrlich gesagt, der Ausdruck nicht gefällt.
-
Braunstein schrieb:
list::end() liefert einen bidirektionalen Iterator auf eine Position hinter dem letzten Element.
Und deshalb klappt der Ausdruck "end()-1" gerade nicht - eine Subraktion von Iteratoren ist nur für Random Access Iteratoren definiert, bei bidirektionalen könntest du höchstens advance() verwenden:
iter_swap(v.begin(),advance(v.end(),-1));
-
Ok, das ist richtig.
aber --v.end() sollte gehen.
-
Ok danke euch allen erst mal für die Antworten.
Es funktioniert perfekt... aber nur wenn ich Elemente gleichen Datentyps tauschen möchte.
Boost::Any hat ja den Vorteil das man da erstmal alles reinpacken kann...
er identifiziert das dann entsprechend...jetzt wollte ich ein String Element am Anfang mit einem IntegerWert am Ende tauschen.... aber da bringt er wieder nur ABBRUCH.
auch habe ich probiert die Werte jeweils im Datentyp Any zu speichern,
nur er wandelt z.b.append_any(values,"Test"); intern in einen Char_Ptr um
und
append_any(values,12345); intern in einen Integer Wert um
und
append_string(values,"Test"); ist von der definition her schon ein String Wert.stösst hier iter_swap an seine Grenzen und gibt es eine Möglichkeit diese Werte trotzdem zu tauschen?
desweiteren nervt etwas, das man nicht it = it+5; machen kann
sondern 5 mal it++; machen muss , wenn man auf das 6te Element navigieren möchte... um dieses z.b. zu removen...merci schon mal
-
Wenn du sehr viel Wert darauf legst, direkt über den Index auf die Elemente zugreifen zu können, ist list<> wohl die falsche Wahl - Direktzugriff bieten (von den std-Containern) nur vector<> und deque<>.
PS: Die einzigen Grenzen, an die iter_swap() stoßen könnte, sind singuläre Iteratoren (v.end()) oder falsche Kopier-Semantik (aber das wäre ein Problem von any).