Cómo devolver un vector desde una función en C++

Jinku Hu 12 octubre 2023
  1. Utiliza la notación vector<T> func() para devolver un vector desde una función
  2. Usar la notación vector<T> &func() para devolver el vector de una función
Cómo devolver un vector desde una función en C++

Este artículo presentará cómo devolver un vector de una función de manera eficiente en C++.

Utiliza la notación vector<T> func() para devolver un vector desde una función

El retorno por valor es el método preferido si devolvemos una variable vector declarada en la función. La eficiencia de este método proviene de su movimiento-semántica. Significa que al devolver un vector no se copia el objeto, por lo que se evita el desperdicio de velocidad/espacio extra. Bajo el capó, apunta el puntero al objeto vector devuelto, proporcionando así un tiempo de ejecución del programa más rápido que el que hubiera llevado copiar toda la estructura o clase.

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

Resultado:

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

Usar la notación vector<T> &func() para devolver el vector de una función

Este método utiliza la notación de retorno por referencia, que es la más adecuada para devolver grandes estructuras y clases. Nótese que no devuelve la referencia de la variable local declarada en la propia función porque conduce a una referencia colgante. En el siguiente ejemplo, pasamos el vector arr por referencia y lo devolvemos también como referencia.

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

Resultado:

arr    - | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
arrby5 - | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 |
Autor: 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

Artículo relacionado - C++ Vector