Lorsque vous voulez retourner plusieurs éléments que vous pouvez utiliser les paramètres de sortie supplémentaires dans vos fonctions (passés par référence) ou retourner un tuple. J'ai tendance à préférer l'option plus tard car il en résulte un code plus lisible.Au lieu de gérer manuellement la mémoire de vos baies avec new
et delete[]
, vous pouvez utiliser std::vector
pour obtenir un comportement équivalent. Chaque vecteur stocke sa propre taille de sorte que vous n'avez pas besoin de retourner une variable supplémentaire pour cela.
En résumé, dans ce cas, vous pouvez simplement retourner un tuple de deux vecteurs. Dans la bibliothèque standard, les tuples à deux éléments sont représentés avec la classe std::pair
. Par conséquent, votre fonction renverra une paire de vecteurs: std::pair<std::vector<int>, std::vector<int> >
. Puisque c'est beaucoup à taper, il vaut mieux utiliser un typedef
.
Ceci est une implémentation possible de votre fonction. Notez que vous pouvez éviter les boucles écrites manuellement grâce à la norme istream_iterator
classe:
typedef std::pair<std::vector<int>, std::vector<int> > Data;
Data read(std::ifstream & ifs)
{
int n;
ifs >> n;
typedef std::istream_iterator<int> in_it;
std::vector<int> a(n);
std::copy(in_it(ifs), in_it(), a.begin());
std::vector<int> b(n);
std::copy(in_it(ifs), in_it(), b.begin());
return Data(a, b);
}
Et voici comment vous utiliserez votre fonction. Remarquez comment vous ne renvoyez pas la taille implicitement mais vous pouvez la récupérer facilement via std::vector::size()
.
int main() {
std::ifstream ifs("SOMEFILE.txt");
Data data = read(ifs);
unsigned int n = data.first.size();
std::vector<int> & a = data.first;
std::vector<int> & b = data.second;
return 0;
}
EDIT: suggestion de Neil d'utiliser un struct
dédié échelles mieux et conduit à un code plus lisible, donc vous devriez certainement considérer que aussi bien. Dans ce cas, votre struct serait:
struct Data {
std::vector<int> a, b;
};
Et votre fonction main
serait identique sauf que vous devez remplacer first
et second
avec a
et b
.
Merci beaucoup! Je connais un peu ce qui précède. Cependant le cours que j'ai suivi en C++ a toujours utilisé des classes dans des exemples avec des listes chaînées et je n'y ai pas pensé dans cet exemple où je n'ai pas besoin des différents tableaux plus tard dans le code. Je comprends les concepts, mais je manque d'expérience pour les utiliser à bon escient ... –
@mrbuxley Gah! La liste liée Malédiction de tous les programmeurs stagiaires! Pour mes opinions sur les choses foutues, voir http://punchlet.wordpress.com/2009/12/27/letter-the-fourth/ –
(= ) Ce que je fais est de réécrire un code de travail pour le rendre aussi efficace que possible Un peu hors sujet ici Mais dois-je aller avec des vecteurs ou des tableaux dynamiques si nous parlons des tailles de tableau de 256 * 256? –