Question

Je souhaite déplacer des éléments du conteneur dans n’importe quelle position, à gauche ou à droite. Les éléments en mouvement ne sont pas contigus.

Par exemple, j’ai un vecteur {1,2,3,4,5,6,7,8} et je souhaite décaler {4,5,7} vers la gauche sur 2 positions. Le résultat attendu sera { 1,4,5,2,7,3,6,8}

Existe-t-il un moyen élégant de le résoudre?

Était-ce utile?

La solution

Vous pouvez écrire votre propre fonction de décalage. En voici un simple:

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

Vous pouvez ensuite l'utiliser comme ça:

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}

Ceci est une implémentation naïve, car lorsqu’on décale plusieurs éléments, find itérera plusieurs fois au début du conteneur. De plus, cela suppose que chaque élément est unique, ce qui pourrait ne pas être le cas. Cependant, j'espère que cela vous a donné des conseils sur la manière de mettre en œuvre ce dont vous avez besoin.

Autres conseils

Ne pouvez-vous pas faire une simple insertion, puis effacer?

N'oubliez pas que vous annulerez la validité des itérateurs faisant référence à des éléments situés au-dessus du point de suppression ou d'insertion, le plus bas des deux.

HTH

acclamations,

Rob

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top