Restituisce più valori dalla funzione in C++

Jinku Hu 12 ottobre 2023
  1. Usa struct per restituire più valori da una funzione in C++
  2. Usa std::pair per restituire più valori da una funzione in C++
  3. Usa Array per restituire più valori da una funzione in C++
Restituisce più valori dalla funzione in C++

Questo articolo illustrerà più metodi su come restituire più valori da una funzione in C++.

Usa struct per restituire più valori da una funzione in C++

Le variabili struct definite dall’utente possono essere utilizzate per restituire più valori dalle funzioni. Vale a dire, dimostriamo un esempio che implementa una struttura di membri a due dati per restituire una coppia int dalla funzione che cerca il massimo/minimo nel vettore degli interi. Si noti che è possibile definire qualsiasi tipo di struct per soddisfare le proprie esigenze ed espandere il conteggio dei membri dei dati. In questo caso, dichiariamo la variabile struct locale nell’ambito della funzione findMaxMin e la restituiamo per valore alla routine main. La variabile struct può anche essere inizializzata nella funzione main e passata a findMaxMin per riferimento per memorizzare lì i valori dei risultati.

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

Produzione:

Maximum element is 20, Minimum - 1

Usa std::pair per restituire più valori da una funzione in C++

std::pair è fornita dalla libreria standard C++ e può memorizzare due oggetti eterogenei come una coppia. Quindi, possiamo reimplementare l’esempio precedente senza definire la nostra struct personalizzata poiché std::pair ha già funzionalità estese incorporate. Uno svantaggio è che può restituire solo due valori se non memorizziamo alcune altre strutture multielemento in essi. Nota che, abbiamo scambiato gli algoritmi di ricerca max/min con quelli STL - rispettivamente std::max_element e std::min_element.

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

Produzione:

Maximum element is 20, Minimum - 1

Usa Array per restituire più valori da una funzione in C++

In alternativa, possiamo dichiarare un array in stile C per memorizzare e restituire più valori dalla funzione. Questo metodo fornisce un’interfaccia più semplice per lavorare con una quantità maggiore di valori. È più efficiente dichiarare un array nella funzione caller e passare il suo indirizzo al chiamato. In questo modo, anche array di grandi dimensioni possono essere passati utilizzando un solo puntatore senza alcun sovraccarico 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;
}

Produzione:

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