Copier un objet conteneur vectoriel en C++

Jinku Hu 12 octobre 2023
  1. Utilisez la notation de liste d’initialisation pour copier un objet conteneur vectoriel en C++
  2. Utilisez l’algorithme std::copy pour copier un objet conteneur vectoriel en C++
  3. Utilisez l’opérateur d’affectation de copie pour copier un objet conteneur vectoriel en C++
  4. Utilisez le constructeur de copie pour copier un objet conteneur vectoriel en C++
  5. Utilisez la fonction membre assign pour copier un objet conteneur vectoriel en C++
Copier un objet conteneur vectoriel en C++

Cet article explique plusieurs méthodes pour copier un objet conteneur std::vector en C++.

Utilisez la notation de liste d’initialisation pour copier un objet conteneur vectoriel en C++

Le std::vector est la structure de données de base fournie dans la bibliothèque de conteneurs STL. Il implémente des éléments de tableau de taille dynamique qui sont stockés de manière contiguë. La gestion de la mémoire se fait automatiquement au fur et à mesure que l’utilisateur ajoute ou supprime des éléments du tableau. On peut faire une copie de l’objet vectoriel en utilisant la notation de liste d’initialisation lors de la construction d’une nouvelle variable de type std::vector. Notez qu’il suffit de passer les itérateurs begin et end de l’objet vectoriel d’origine qui doit être copié dans un nouvel objet. En utilisant la même notation, vous pouvez extraire n’importe quel sous-vecteur de l’objet en spécifiant les itérateurs correspondants comme arguments dans les accolades.

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c = {vec1.begin(), vec1.end()};
  vector<int> vec1_cc = {vec1.begin(), vec1.end() - 4};

  printVector(vec1_c);
  printVector(vec1_cc);

  return EXIT_SUCCESS;
}

Production:

23;
43;
324;
222;
649;
102;
40;
304;
23;
43;
324;
222;

Utilisez l’algorithme std::copy pour copier un objet conteneur vectoriel en C++

Une autre méthode pour copier l’objet std::vector consiste à invoquer la fonction std::copy de la bibliothèque d’algorithmes STL. Il fournit l’opération de copie générique pour les objets basés sur la plage. La fonction a plusieurs surcharges, mais la surcharge utilisée dans l’extrait de code suivant prend trois arguments d’itérateur. Les deux premiers spécifient la plage de vecteurs d’origine, tandis que le troisième itérateur indique le début de la plage de vecteurs de destination.

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c(vec1.size());
  copy(vec1.begin(), vec1.end(), vec1_c.begin());
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

Production:

23;
43;
324;
222;
649;
102;
40;
304;

Utilisez l’opérateur d’affectation de copie pour copier un objet conteneur vectoriel en C++

Alternativement, vous pouvez utiliser l’opérateur d’affectation de copie pour copier le contenu de l’objet conteneur std::vector. Cette notation est la solution la plus concise pour ce problème. Nous avons juste besoin d’affecter la variable du vecteur d’origine à l’objet vecteur nouvellement déclaré.

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c = vec1;
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

Production:

23;
43;
324;
222;
649;
102;
40;
304;

Utilisez le constructeur de copie pour copier un objet conteneur vectoriel en C++

D’un autre côté, un constructeur de copie de la classe std::vector offre une méthode similaire pour copier le vecteur dans un objet vectoriel nouvellement déclaré. Dans ce cas, nous devons passer la variable du vecteur d’origine entre parenthèses lorsque la variable vectorielle nouvellement créée est déclarée.

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c(vec1);
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

Production:

23;
43;
324;
222;
649;
102;
40;
304;

Utilisez la fonction membre assign pour copier un objet conteneur vectoriel en C++

Le conteneur std::vector fournit la fonction membre assign, que vous pouvez utiliser pour remplacer le contenu d’un objet vectoriel par les éléments d’un autre vecteur. Notez que nous pouvons initialiser un conteneur vector vide, puis invoquer la fonction assign à partir de l’objet pour copier le contenu d’un autre vecteur.

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c;
  vec1_c.assign(vec1.begin(), vec1.end());
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

Production:

23;
43;
324;
222;
649;
102;
40;
304;
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Vector