Probleme mit typedef std::list<boost::any> many;
-
Wenn du zwei Iteratoren hast, kannst du mit
std::iter_swap(it1, it2);die Inhalte vertauschen (also nicht die Iteratoren werden getauscht, sondern die Daten auf die die Iteratoren "zeigen").
-
Zum ändern kannst du ja einfach den entsprechenden Iterator verwenden.
Einfügen geht z.Bsp. über insert.
-
Th schrieb:
Wenn du zwei Iteratoren hast, kannst du mit
std::iter_swap(it1, it2);die Inhalte vertauschen (also nicht die Iteratoren werden getauscht, sondern die Daten auf die die Iteratoren "zeigen").
mhh irgendwie geht da was nicht...
habe zwei iteratoren . einer heisst it und zeigt auf begin() und der andere heisst endit und zeigt auf end()
erzeugt hab ich die mit folgendem befehlen:many::iterator it = values.begin(); //erzeuge Iterator it und setze auf values.begin() many::iterator endit = values.end(); //erzeuge Iterator endIt und setzte auf values.end()wobei beide auf die folgende Struktur verweisen...
using boost::any_cast; typedef std::list<boost::any> many; many values; using namespace std;die liste wurde vorher mit werten befüllt...
append_int(values,0); append_int(values,1); append_int(values,4); append_int(values,5); append_int(values,6); append_int(values,8856); append_any(values,12322131); append_string(values,"012345678901234567890123456789"); append_string(values,"asa"); append_string(values,"tast"); append_string(values,"sd");so funktioniert ausgabe der Liste einwandfrei..
kompilieren kann er es ... aber beim Ausführen kackt er ab

wenn ich programm ausführe und
die beiden tauschen möchte dann kommt nur immer die Meldung: Abbruchwas is da falsch dran?
p.s. #include <algorithm> ist auch mit dabei

-
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).