Zweidimensionaler Vector einfügen
-
Wie bereits beschrieben, ist das Beispiel nur zum verstehen meiner Fragestellung gedacht. Es kommt schlussendlich Text in den String, desshalb auch der String

Leider ist das so nich das was ich wollte, ich möchte nämlich nicht den ganzen Vector einfügen sondern nur den Abschnit [0]. Davor und dahinter sind noch Daten die nicht eingefügt werden sollen, in beiden Vecoren.
-
Dann eben so:
String2.insert( String2.begin(), String1.begin(), String1.begin()+1 );(Oder std::advance(), statt "+1")
-
Schlussendlich sind es aber mehr als 10'000 Strings in dem Vector, mit an die 1000 Arrays. Ich will aber nur eine Arraygruppe einfügen, nicht den ganzen Vector. In dem Beispiel möchte ich alle Strings in string1[0] (kann auch 568 statt 0 sein) an eine beliebige stelle von string2 einfügen. In dem Beispiel in string2 [2].
Ich hoffe mein Standpunkt ist nun ausreichend erklärt

-
Mathiable schrieb:
Schlussendlich sind es aber mehr als 10'000 Strings in dem Vector, mit an die 1000 Arrays.
Öha, dann ist vllt. vector auch der falsche Container! Da muss für jedes Vergrößern der ganze Vector kopiert werden. Für ein Einfügen in der Mitte müssen für jedes insert alle nachfolgenden Werte um eins Verschoben werden. Das ist ja RAM-Mord

Wenn du eh schon auf eine Lösung mit Iteratoren abzielst solltest du auch gleich std::list verwenden.
-
Mathiable schrieb:
Schlussendlich sind es aber mehr als 10'000 Strings in dem Vector, mit an die 1000 Arrays. Ich will aber nur eine Arraygruppe einfügen, nicht den ganzen Vector. In dem Beispiel möchte ich alle Strings in string1[0] (kann auch 568 statt 0 sein) an eine beliebige stelle von string2 einfügen. In dem Beispiel in string2 [2].
Ich hoffe mein Standpunkt ist nun ausreichend erklärt

Was anderes macht der Code auch gar nicht...
-
maldreatura schrieb:
Öha, dann ist vllt. vector auch der falsche Container! Da muss für jedes Vergrößern der ganze Vector kopiert werden. Für ein Einfügen in der Mitte müssen für jedes insert alle nachfolgenden Werte um eins Verschoben werden. Das ist ja RAM-Mord

Wenn du eh schon auf eine Lösung mit Iteratoren abzielst solltest du auch gleich std::list verwenden.Hier ist das Problem das ich sehr viel herauslesen muss. das mach ich jetzt noch direkt. Wenn ich das bei "Aufbau der STL" richtig verstanden habe, ist das mit list nur mühsam möglich, deswegen habe ich den Vector genommen.
Dann heisst es also RAM ermorden, oder neuen Thread eröffnen und die umgekehrte Frage für std::list stellen?

David_pb schrieb:
Was anderes macht der Code auch gar nicht...
Der befehl "insert" verlangt aber (int, string*, string*), unterstützt aber keine zweidimensionalen String-Vectoren, so dass es für diesen Fall nicht der richtige Befehl währe, da ich mittendrin einen beliebigen zweidimensionaler Vector einfügen möchte.
-
Mathiable schrieb:
David_pb schrieb:
Was anderes macht der Code auch gar nicht...
Der befehl "insert" verlangt aber (int, string*, string*), unterstützt aber keine zweidimensionalen String-Vectoren, so dass es für diesen Fall nicht der richtige Befehl währe, da ich mittendrin einen beliebigen zweidimensionaler Vector einfügen möchte.
Seit wann denn?

-
David_pb schrieb:
Seit wann denn?

Das meldet er zumindes bei mir:
"[C++ Error] Auswerten.cpp(847): E2285 Could not find a match for 'vector<vector<string,allocator<string> >,allocator<vector<string,allocator<string> > > >::insert(int,char *,char *)'"
Ich interpretier das jedenfalls so. Spielt aber so oder so keine Rolle, da man bei Vectoren nicht mittendrin etwas einfügen kann. Ich zerstör wohl lieber den RAM, der Aufwand ist sonst zu gross...
-
Mathiable schrieb:
Hier ist das Problem das ich sehr viel herauslesen muss. das mach ich jetzt noch direkt. Wenn ich das bei "Aufbau der STL" richtig verstanden habe, ist das mit list nur mühsam möglich, deswegen habe ich den Vector genommen.
Es kommt drauf an, ob du Random Access brauchst (über
operator[]). Nur zum Durchiterieren ist das nämlich nicht nötig. Ausserdem gibts ja auch nochstd::deque.Mathiable schrieb:
Dann heisst es also RAM ermorden, oder neuen Thread eröffnen und die umgekehrte Frage für std::list stellen?

Du darfst die Frage ruhig hier stellen. Aber sag erst mal, welche Operationen du auf dem Container genau benötigst, dann können wir eher entscheiden, was geeignet ist.
Mathiable schrieb:
Der befehl "insert" verlangt aber (int, string*, string*), unterstützt aber keine zweidimensionalen String-Vectoren, so dass es für diesen Fall nicht der richtige Befehl währe, da ich mittendrin einen beliebigen zweidimensionaler Vector einfügen möchte.
In C++ spricht man eigentlich nicht von Befehlen, eher von Funktionen und Anweisungen.
Die Memberfunktion
std::vector::insert()hat eine solche Überladung:template <class InputIterator> void insert ( iterator position, InputIterator first, InputIterator last );Es handelt sich also um ein Template. Damit kannst du den Typ für
InputIteratorfrei wählen, sofern er das entsprechende Iterator-Konzept unterstützt. Es kann durchaus auch ein Iterator in einen verschachtelten Container sein.
-
Dann möge es so sein

Für mich ist es soweit abgeschlossen, seit ich herausgefunden habe, dass ich mit einem anderen Container gegen 200 Zeilen abändern müsste. Da ist es für mich einfacher den RAM zu ermorden

Ausserdem kommt das mittendrin-einfügen beim Ablauf nur einmal vor, das direkte ansteuern aber mehrere zehntausend Mal, also ist für meinen fall der Vector wohl oder übel die bessere Wahl.