Comment faire pour retourner un vecteur à 2 dimensions?
J'ai une fonction qui crée un vecteur 2D
void generate(int n)
{
vector< vector<int> > V (n, vector<int>(1 << n , 0 ));
.......
}//n is used to determine the size of vector
Maintenant, j'ai besoin de retourner a créé vecteur de l'utiliser dans une autre fonction .Si je n'ai
return V ;
ce sera mauvais parce que V est une variable locale, mais je ne peux pas définir V à l'extérieur de la fonction, car cette fonction définit la taille de V . Que dois-je faire ?
- juste par curiosité: avez-vous besoin d'écrire votre propre générateur de "alg"? Pourquoi ne pas utiliser std::generate_n?
- Ce n'est pas l'ensemble de la fonction , le reste de la fonction génère une table de vérité .
Vous devez vous connecter pour publier un commentaire.
Vous pouvez
return V
avec pas de questions de il sera de retour une copie de la variable locale. Les questions ne se posent que lorsque vous revenez à un référence ou pointeur à une variable de portée locale; lorsque la fonction se termine, la variable locale est hors de portée et est détruit et la référence/pointeur n'est plus valide.Alternativement, vous pouvez accepter une référence à un vecteur comme votre argument, en écriture et de retour void:
C'est plus rapide que de retourner une copie de membre local, qui peut être coûteux pour les objets volumineux tels que les multi-dimensions des vecteurs.
clear()
le vecteur si vous n'êtes pas sûr qu'elle soit vide.La valeur de retour est une copie de la variable locale
v
donc il n'y a pas de problème.Si vous êtes inquiet à propos de la copie du vecteur, peut-être que vous pourriez faire quelque chose comme ceci:
si le vecteur est petit, juste retour par valeur, il sera copié.
si le vecteur est grand, l'appelant peut passer le dest vecteur de référence.
Comme alternative à d'autres réponses, vous pouvez retourner le pointeur de segment de mémoire allouée vecteur. Pour la sécurisation de fuites de mémoire vous pouvez utiliser le bouton "déplacer constructeur" l'idiome.
Ce langage peut être utilisé pour n'importe quel "lourd" de l'objet. Si tu veux prolonge la durée de vie de l'objet retourné, vous pouvez l'affecter à shared_ptr (à titre d'exemple boost::shared_ptr). Mais je pense que c'est mieux exemplaire de retour à chaque fois que c'est possible, pour réduire la complexité de votre code.