Wie kann ich Schaltelemente innerhalb STL-Container
-
19-08-2019 - |
Frage
Ich möchte Elemente im Inneren des Behälters nach links oder rechts auf beliebigen Positionen verschieben. Die Schaltelemente sind nicht zusammenhängend ist.
zB Ich habe einen Vektor {1,2,3,4,5,6,7,8} und ich möchte verschieben {4,5,7} nach links auf 2 Positionen, wird das erwartete Ergebnis sein { 1,4,5,2,7,3,6,8}
Gibt es eine elegante Art und Weise, es zu lösen?
Lösung
Sie können Ihre eigene Verschiebefunktion schreiben. Hier ist einfach:
#include <iterator>
#include <algorithm>
template <typename Container, typename ValueType, typename Distance>
void shift(Container &c, const ValueType &value, Distance shifting)
{
typedef typename Container::iterator Iter;
// Here I assumed that you shift elements denoted by their values;
// if you have their indexes, you can use advance
Iter it = find(c.begin(), c.end(), value);
Iter tmp = it;
advance(it, shifting);
c.erase(tmp);
c.insert(it, 1, value);
}
Sie können dann verwenden, wie folgt aus:
vector<int> v;
// fill vector to, say, {1,2,3,4,5}
shift(v, 4, -2); // v = {1,4,2,3,5}
shift(v, 3, 1); // v = {1,4,2,5,3}
Dies ist eine naive Implementierung, denn wenn mehrere Elemente verschieben, find
oft am Anfang des Behälters durchlaufen wird. Darüber hinaus wird davon ausgegangen, dass jedes Element eindeutig ist, was nicht der Fall sein könnte. Aber ich hoffe, es hat Ihnen einige Hinweise, wie man das umsetzen, was Sie benötigen.
Andere Tipps
Sie können nicht tun, einen einfachen Einsatz und dann löschen?
Vergessen Sie nicht, dass Sie alle Iteratoren ungültig werden, die Elementen über dem Entfernen oder Einfügemarke beziehen, falls dieser Wert niedriger ist.
HTH
prost,
Rob