HOWTO · C++

Restituisce un vettore da una funzione in C++

Questo articolo introduce come restituire un vettore da una funzione in modo efficiente in C++

In questa pagina

Questo articolo introdurrà come restituire un vettore da una funzione in modo efficiente in C++.

Usa la notazione vector<T> func() per restituire un vettore da una funzione

Il ritorno in base al valore è il metodo preferito se restituiamo una variabile vettore dichiarata nella funzione. L’efficienza di questo metodo deriva dalla sua semantica di spostamento. Significa che restituire un vettore non copia l’oggetto, evitando così di sprecare ulteriore velocità / spazio. Dietro le quinte, punta il puntatore all’oggetto vettore restituito, fornendo così un tempo di esecuzione del programma più veloce di quanto avrebbe richiesto la copia dell’intera struttura o classe.

#include <iostream>
#include <iterator>
#include <vector>

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

vector<int> multiplyByFour(vector<int> &arr) {
  vector<int> mult;
  mult.reserve(arr.size());

  for (const auto &i : arr) {
    mult.push_back(i * 4);
  }
  return mult;
}

int main() {
  vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector<int> arrby4;

  arrby4 = multiplyByFour(arr);

  cout << "arr    - | ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, " | "));
  cout << endl;
  cout << "arrby4 - | ";
  copy(arrby4.begin(), arrby4.end(), std::ostream_iterator<int>(cout, " | "));
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

arr    - | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
arrby4 - | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 |

Usa la notazione vector<T> &func() per restituire un vettore da una funzione

Questo metodo utilizza la notazione return by reference, che è più adatta per restituire strutture e classi di grandi dimensioni. Si noti che non restituisce il riferimento della variabile locale dichiarata nella funzione stessa perché porta a un riferimento penzolante. Nell’esempio seguente, passiamo il vettore arr per riferimento e lo restituiamo anche come riferimento.

#include <iostream>
#include <iterator>
#include <vector>

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

vector<int> &multiplyByFive(vector<int> &arr) {
  for (auto &i : arr) {
    i *= 5;
  }
  return arr;
}

int main() {
  vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector<int> arrby5;

  cout << "arr    - | ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, " | "));
  cout << endl;

  arrby5 = multiplyByFive(arr);

  cout << "arrby5 - | ";
  copy(arrby5.begin(), arrby5.end(), std::ostream_iterator<int>(cout, " | "));
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

arr    - | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
arrby5 - | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 |