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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top