iterator von einem Typ zum andere konvertieren?
-
Hi,
ich habe folgendes Problem: Zwei Vektoren mit verschiedenen Inhalten, aber Ende des Codes sollten sie gleiche Größe haben:
std::vector<T1> T1_vector; std::vector<T2> T2_vector; // füllen der Vektoren ... for (std::vector<T1>::const_iterator T1_it = T1_vector.begin(); T1_it != T1_vector.end(); T1_it++) { // hier folgt einiger Code T2_vector.insert(T1_it, object of T2); }Das funktioniert aber nicht, weil T1_it vom falschen Typ ist. Wie könnte ich denn einen T2-iterator auf die Position von T1_it setzten, so dass ich an der gewünschten Position inserieren kann? Irgendwie stehe ich auf dem Schlauch ...
Danke,
Christian
-
> aber Ende des Codes sollten sie gleiche Größe haben
ganz einfach:
T1_vector.resize(99);
T2_vector.resize(99);==> gleiche Größe
Das ist wahrscheinlich nicht das, was Du willst. Beschreibe Dein Problem genauer.
-
Ich glaube er will in T2 an der Stelle etwas einfügen (im Sinne von x-te Stelle), an der das durch den Iterator gegebene Element in T1 steht. Also z.B. der Iterator zeigt auf das 5. Element in T1_vector und dann an Stelle 5 etwas in T2_vector einfügen.
Was die Frage aufwirft, warum er dann überhaupt erst Iteratoren nimmt und nicht gleich Zahlen. Ist schließlich nicht verboten die random access Fähigkeiten des vectors zu benutzen.
-
krümelkacker schrieb:
==> gleiche Größe
Das ist wahrscheinlich nicht das, was Du willst. Beschreibe Dein Problem genauer.
In der Tat, das ist sekundär und war vielleicht verwirrend ...
Was ich erreichen möchte, ist an der Position an der sich T1_it befindet in T2_vector inserieren mit .insert(). Das funktioniert aber nicht (was ich meinte ist das T1 und T2 nicht derselbe Typ sind), da der Compiler einen anderen allocator erwartet. Wie kann ich also einen T2-iterator, wie
std::vector<T2>::const_iterator T2_it;auf die Position von T1_it zeigen lassen?
-
Da ein Vektor Random-Access-Iteratoren hat, kannst du
T2_vector.begin() + std::distance(T1_vector.begin(), T1_it)benutzen.
-
SeppJ schrieb:
Was die Frage aufwirft, warum er dann überhaupt erst Iteratoren nimmt und nicht gleich Zahlen. Ist schließlich nicht verboten die random access Fähigkeiten des vectors zu benutzen.
Weil vector.insert einen Iterator verlangt und ich genau diese Funktion brauche - allerdings ist der letzte Punkt wesentlich: Wie dumm von mir, es ginge ja:
T2_vector.insert(T2_vector.begin() + x, ...)wobei x der gewünschte offset ist! Arrgh ... erwähnte ich schon gerade auf dem Schlauch zu stehen? *rotwerd*
Danke!
Christianedit: bzw. seldon's Lösung, die durch das Explizite punktet!
-
Wenn ich richtig verstanden habe, was Du willst, kannst Du dir die ganze Schleife sparen und diesen einen Aufruf tätigen:
T2vec.insert(T2vec.begin(),T1vec.begin(),T1vec.end());Dazu muss aber T1 implizit nach T2 konvertierbar sein.
Wenn Du die in T2 befindlichen Elemente nicht vor Dir herschieben willst, würde es auch mit vector<>::assign(iterator_range) gehen.
Einzelne Elemente per insert einem Vektor hinzufügen ist typischerweise sehr langsam, es sei denn, du fügst immer am Ende ein. Das Einfügen in einem Rutsch sollte in den meisten Fällen viel schneller sein.