web-dev-qa-db-fra.com

Est-il sûr d'échanger deux vecteurs différents en C ++, en utilisant la méthode std :: vector :: swap?

Supposons que vous ayez le code suivant:

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> First{"example", "second" , "C++" , "Hello world" };
    std::vector<std::string> Second{"Hello"};

    First.swap(Second);

    for(auto a : Second) std::cout << a << "\n";
    return 0;
}

Imaginez que le vecteur ne soit pas std::string, Pourtant les classes:

std::vector<Widget> WidgetVector;

std::vector<Widget2> Widget2Vector;

Est-il toujours sûr d'échanger les deux vecteurs avec la méthode std::vector::swap: WidgetVector.swap(Widget2Vector); ou cela conduira à un UB?

30
Emanuele Oggiano

using std::swap; swap(a, b); et a.swap(b); ont exactement la même sémantique que celle-ci fonctionne; au moins pour tout type sain d'esprit. Tous les types standard sont sains à cet égard.

À moins que vous n'utilisiez un allocateur intéressant (c'est-à-dire avec état, pas toujours égal et non propagé sur l'échange de conteneurs, voir std::allocator_traits ), échange de deux std::vector s avec les mêmes arguments de modèle n'est qu'un échange ennuyeux de trois valeurs (pour la capacité, la taille et le pointeur de données). Et l'échange de types de base, les courses de données absentes, est sûr et ne peut pas être lancé.

Cela est même garanti par la norme. Voir std::vector::swap() .

0
Deduplicator