web-dev-qa-db-fra.com

C ++ essayant d'échanger des valeurs dans un vecteur

Ceci est ma fonction d'échange:

template <typename t>
void swap (t& x, t& y)
{
    t temp = x;
    x = y;
    y = temp;
    return;
}

Et ceci est mon appel de fonction (sur une note latérale v stocke des chaînes) pour échanger des valeurs, mais chaque fois que j'essaie d'appeler en utilisant des valeurs dans un vecteur, une erreur se produit. Je ne suis pas sûr de ce que je fais mal.

swap(v[position], v[nextposition]); //creates errors
45
user782311

Je pense que ce que vous recherchez est iter_swap que vous pouvez trouver aussi dans <algorithm>.
tout ce que vous avez à faire est de simplement passer deux itérateurs, chacun pointant sur l’un des éléments que vous souhaitez échanger.
puisque vous avez la position des deux éléments, vous pouvez faire quelque chose comme ceci:

// assuming your vector is called v
iter_swap(v.begin() + position, v.begin() + next_position);
// position, next_position are the indices of the elements you want to swap
100

Les deux possibilités proposées (std::swap et std::iter_swap) fonctionnent, leur syntaxe est légèrement différente. Échangeons les premier et deuxième éléments d'un vecteur, v[0] et v[1].

Nous pouvons échanger en fonction du contenu des objets:

std::swap(v[0],v[1]);

Ou échangez sur l'itérateur sous-jacent:

std::iter_swap(v.begin(),v.begin()+1);

Essayez le:

int main() {
  int arr[] = {1,2,3,4,5,6,7,8,9};
  std::vector<int> * v = new std::vector<int>(arr, arr + sizeof(arr) / sizeof(arr[0]));
  // put one of the above swap lines here
  // ..
  for (std::vector<int>::iterator i=v->begin(); i!=v->end(); i++)
    std::cout << *i << " ";
  std::cout << std::endl;
}

Les deux fois, vous obtenez les deux premiers éléments échangés:

2 1 3 4 5 6 7 8 9
42
linse

Il y a un std::swap dans <algorithm>

21
Ólafur Waage

après avoir passé le vecteur par référence

swap(vector[position],vector[otherPosition]);

produira le résultat attendu.

4
faro_hf