Retornar vários valores da função em C++

Jinku Hu 12 outubro 2023
  1. Use struct para retornar vários valores de uma função em C++
  2. Use std::pair para retornar vários valores de uma função em C++
  3. Use Array para retornar vários valores de uma função em C++
Retornar vários valores da função em C++

Este artigo demonstrará vários métodos sobre como retornar vários valores de uma função em C++.

Use struct para retornar vários valores de uma função em C++

Variáveis ​​struct personalizadas podem ser usadas para retornar vários valores de funções. Nomeadamente, demonstramos um exemplo que implementa uma estrutura membro de dois dados para retornar um par int da função que procura o máximo/mínimo no vector de inteiros. Observe que é possível definir qualquer tipo de struct para atender às suas necessidades e expandir a contagem de membros de dados. Nesse caso, declaramos a variável struct local no escopo da função findMaxMin e a retornamos por valor para a rotina main. A variável struct também pode ser inicializada na função main e passada para findMaxMin por referência para armazenar os valores de resultado lá.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

struct IntPair {
  int first, second;
} typedef IntPair;

IntPair findMaxMin(vector<int> &arr) {
  IntPair ret;
  int max = arr[0];
  int min = arr[0];

  for (const auto &item : arr) {
    if (item > max) max = item;
    if (item < min) min = item;
  }

  ret.first = max;
  ret.second = min;
  return ret;
}

int main() {
  vector<int> array = {1,  2,  3,  4,  5,  6,  7,  8,  9,  10,
                       11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

  auto ret = findMaxMin(array);
  cout << "Maximum element is " << ret.first << ", Minimum - " << ret.second
       << endl;

  return EXIT_SUCCESS;
}

Resultado:

Maximum element is 20, Minimum - 1

Use std::pair para retornar vários valores de uma função em C++

std::pair é fornecido com a biblioteca padrão C++, e pode armazenar dois objetos heterogêneos como um par. Assim, podemos reimplementar o exemplo anterior sem definir nosso struct personalizado, pois o std::pair já possui uma extensa funcionalidade embutida. Uma desvantagem é que ele só pode retornar dois valores se não armazenarmos algumas outras estruturas de vários elementos neles. Note que trocamos os algoritmos de busca max /min por STL - std::max_element e std::min_element respectivamente.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

std::pair<int, int> findMaxMin2(vector<int> &arr) {
  std::pair<int, int> ret;

  auto max = std::max_element(arr.begin(), arr.end());
  auto min = std::min_element(arr.begin(), arr.end());

  ret.first = arr.at(std::distance(arr.begin(), max));
  ret.second = arr.at(std::distance(arr.begin(), min));
  return ret;
}

int main() {
  vector<int> array = {1,  2,  3,  4,  5,  6,  7,  8,  9,  10,
                       11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

  auto ret = findMaxMin2(array);
  cout << "Maximum element is " << ret.first << ", Minimum - " << ret.second
       << endl;

  return EXIT_SUCCESS;
}

Resultado:

Maximum element is 20, Minimum - 1

Use Array para retornar vários valores de uma função em C++

Como alternativa, podemos declarar um array de estilo C para armazenar e retornar vários valores da função. Este método fornece uma interface mais direta para trabalhar com uma quantidade maior de valores. É mais eficiente declarar um array na função do chamador e passar seu endereço para o receptor. Dessa forma, até mesmo arrays enormes podem ser passados ​​usando apenas um ponteiro sem qualquer sobrecarga crescente.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

int *findMaxMin2(vector<int> &arr, int ret[]) {
  auto max = std::max_element(arr.begin(), arr.end());
  auto min = std::min_element(arr.begin(), arr.end());

  ret[0] = arr.at(std::distance(arr.begin(), max));
  ret[1] = arr.at(std::distance(arr.begin(), min));

  return ret;
}

int main() {
  vector<int> array = {1,  2,  3,  4,  5,  6,  7,  8,  9,  10,
                       11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
  int ret_array[2];

  auto ret = findMaxMin2(array, ret_array);
  cout << "Maximum element is " << ret[0] << ", Minimum - " << ret[1] << endl;

  return EXIT_SUCCESS;
}

Resultado:

Maximum element is 20, Minimum - 1
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

Artigo relacionado - C++ Function