2016-06-13 19 views
1

Angenommen, wir erhalten std::vector<T> V und einen Iterator p an einer Position innerhalb des Vektors.Resize-Vektor mit einem Iterator in C++

Q1: Was ist ein guter Weg, um einen neuen Vektor zurück w, für die die angegebene Iterator p std :: end (w)?

Ich könnte einen neuen Vektor w erstellen, verschiebe die Elemente von std :: begin (v) zu und weise p = std::end(w) zu.

Q2: Gibt es eine Möglichkeit zu tun, was ich will, aber halten pconst?

Der Ursprung meiner Frage ist folgender: Ich habe einen Vektor, für den ich std::remove(std::begin(v),std::end(v), elem) bewarb. Dies sollte alle Elemente, die ungleich elem sind, zurückgeben und einen Iterator an das Ende dieses Bereichs zurückgeben. Ich möchte den Vektor dort schneiden.

+0

Sie können keine * neu * Vektor zurückzukehren, weil Der Iterator ist nur für den gegebenen Vektor gültig. Wenn Sie jedoch den vorhandenen Vektor ändern möchten, können Sie einfach 'V.erase (p, V.end())' aufrufen. –

+2

Warum denkst du, dass du das machen willst? –

+0

@LightnessRacesinOrbit Erweitern Sie die Frage mit den Gründen – myfirsttime1

Antwort

6

Sie können dies tun:

std::vector<T> w = v; 
v.erase(p, v.end()); 
w.swap(v); 

Jetzt p ist ein Iterator in w, p == w.end() und v ist der ursprüngliche Vektor. Beachten Sie, dass durch das Tauschen von zwei dynamischen Containern (mit entsprechenden Zuordnern) Iteratoren eines Containers zu Iteratoren des anderen Containers werden.

Dies funktioniert nicht wirklich für die Rückgabe von Werten aus Funktionen, da es keine ähnliche Garantie für die Konstruktion der Bewegung gibt, noch ist die Eliminierung der Kopie obligatorisch.


Angesichts der Tatsache, dass Sie sagen, dass p das Ergebnis remove ist, vielleicht eine einfachere Lösung wäre die typische remove-Lösch Idiom:

v.erase(std::remove(std::begin(v),std::end(v), elem), std::end(v)); 
+0

[Demo] (http://ideone.com/7jsSOK) –

+0

Um dies zu tun: 'v.resize (Std :: distance (v.begin(), p));' –