HOWTO · C++

Comment retourner un vecteur à partir d'une fonction en C++

Cet article présente comment retourner un vecteur à partir d'une fonction efficace en C++

Cet article présentera comment retourner un vecteur à partir d’une fonction efficacement en C++.

Utilisez la notation vector<T> func() pour retourner un vecteur à partir d’une fonction

Le retour par valeur est la méthode préférée si nous retournons une variable vector déclarée dans la fonction. L’efficacité de cette méthode provient de sa sémantique des mouvements. Cela signifie que le retour d’un vecteur ne copie pas l’objet, évitant ainsi de perdre de la vitesse/espace supplémentaire. Sous le capot, elle pointe le pointeur vers l’objet vector renvoyé, ce qui permet d’accélérer l’exécution du programme par rapport à la copie de la structure ou de la classe entière.

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

Production:

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

Utilisez la notation vector<T> &func() pour retourner un vecteur à partir d’une fonction

Cette méthode utilise la notation par référence, qui est la plus adaptée pour le retour des grandes structures et des classes. Notez que ne retournez pas la référence de la variable locale déclarée dans la fonction elle-même car elle conduit à une référence pendante. Dans l’exemple suivant, nous passons le vecteur arr par référence et le retournons également comme référence.

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

Production:

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