Domanda

Voglio spostare gli elementi all'interno del contenitore su qualsiasi posizione a sinistra o a destra. Gli elementi mobili non sono contigui.

ad es. ho un vettore {1,2,3,4,5,6,7,8} e voglio spostare {4,5,7} a sinistra su 2 posizioni, il risultato atteso sarà { 1,4,5,2,7,3,6,8}

Esiste un modo elegante per risolverlo?

È stato utile?

Soluzione

Puoi scrivere la tua funzione di cambio. Eccone uno semplice:

#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);
}

Puoi quindi usarlo in questo modo:

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}

Questa è un'implementazione ingenua, perché quando si spostano più elementi, find ripeterà più volte all'inizio del contenitore. Inoltre, presuppone che ogni elemento sia unico, il che potrebbe non essere il caso. Tuttavia, spero che ti abbia dato alcuni suggerimenti su come implementare ciò di cui hai bisogno.

Altri suggerimenti

Non puoi fare un semplice inserimento e poi cancellare?

Non dimenticare che invalidi tutti gli iteratori che fanno riferimento a elementi sopra il punto di rimozione o inserimento, a seconda di quale sia il più basso.

HTH

applausi,

Rob

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top