Copia un oggetto contenitore vettoriale in C++

Jinku Hu 12 ottobre 2023
  1. Usa la notazione della lista degli inizializzatori per copiare un oggetto contenitore vettoriale in C++
  2. Usa l’algoritmo std::copy per copiare un oggetto contenitore vettoriale in C++
  3. Utilizzare l’operatore di assegnazione di copia per copiare un oggetto contenitore vettoriale in C++
  4. Usa il costruttore di copia per copiare un oggetto contenitore vettoriale in C++
  5. Usare la funzione membro assign per copiare un oggetto contenitore vettoriale in C++
Copia un oggetto contenitore vettoriale in C++

Questo articolo spiega diversi metodi su come copiare un oggetto contenitore std::vector in C++.

Usa la notazione della lista degli inizializzatori per copiare un oggetto contenitore vettoriale in C++

Lo std::vector è la struttura dati di base fornita nella libreria dei contenitori STL. Implementa elementi array di dimensioni dinamiche i cui elementi sono archiviati in modo contiguo. La gestione della memoria viene eseguita automaticamente quando l’utente aggiunge o rimuove elementi dall’array. Possiamo fare una copia dell’oggetto vettore usando la notazione della lista di inizializzatori quando costruiamo una nuova variabile del tipo std::vector. Nota che abbiamo solo bisogno di passare gli iteratori begin e end dell’oggetto vettoriale originale che deve essere copiato in un nuovo oggetto. Utilizzando la stessa notazione, puoi estrarre qualsiasi sottovettore dell’oggetto specificando gli iteratori corrispondenti come argomenti tra parentesi graffe.

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

Produzione:

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

Usa l’algoritmo std::copy per copiare un oggetto contenitore vettoriale in C++

Un altro metodo per copiare l’oggetto std::vector è invocare la funzione std::copy dalla libreria degli algoritmi STL. Fornisce l’operazione di copia generica per gli oggetti basati su intervallo. La funzione ha più overload, ma l’overload utilizzato nel seguente frammento di codice accetta tre argomenti dell’iteratore. I primi due specificano l’intervallo del vettore originale, mentre il terzo iteratore indica l’inizio dell’intervallo del vettore di destinazione.

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

Produzione:

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

Utilizzare l’operatore di assegnazione di copia per copiare un oggetto contenitore vettoriale in C++

In alternativa, è possibile utilizzare l’operatore di assegnazione della copia per copiare il contenuto dell’oggetto contenitore std::vector. Questa notazione è la soluzione più concisa per questo problema. Abbiamo solo bisogno di assegnare la variabile del vettore originale all’oggetto vettore appena dichiarato.

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

Produzione:

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

Usa il costruttore di copia per copiare un oggetto contenitore vettoriale in C++

D’altra parte, un costruttore di copie della classe std::vector offre un metodo simile per copiare il vettore in un oggetto vettoriale appena dichiarato. In questo caso, dobbiamo passare la variabile del vettore originale tra parentesi quando viene dichiarata la variabile del vettore appena creata.

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

Produzione:

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

Usare la funzione membro assign per copiare un oggetto contenitore vettoriale in C++

Il contenitore std::vector fornisce la funzione membro assign, che puoi utilizzare per sostituire il contenuto di un oggetto vettoriale con gli elementi di un altro vettore. Si noti che possiamo inizializzare un contenitore vettore vuoto e quindi invocare la funzione assign ​​dall’oggetto per copiare il contenuto di un altro vettore.

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

Produzione:

23;
43;
324;
222;
649;
102;
40;
304;
Autore: 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

Articolo correlato - C++ Vector