Retourner un pointeur vers un élément vector en c++
J'ai un vecteur de myObjects dans la portée globale.
J'ai une méthode qui utilise un std::vector<myObject>::const_iterator
pour parcourir le vecteur, et en faisant quelques comparaisons pour trouver un élément spécifique.
Une fois j'ai trouvé l'élément requis, je veux être en mesure de retourner un pointeur (le vecteur existe dans la portée globale).
Si je retourne &iterator
, suis-je retourner l'adresse de la variable d'itération ou de l'adresse de ce que l'itérateur pointant vers?
Dois-je jeter la const_iterator
retour à un myObject, puis retourner l'adresse de qui?
- Je vous suggère de lire cet article de Scott Meyers sur les itérateurs d'utilisation: ddj.com/cpp/184401406 Il donne des lignes directrices sur la conversion de const_iterator à itérateur, etc.
Vous devez vous connecter pour publier un commentaire.
Renvoyer l'adresse de l'objet pointé par l'itérateur:
Edit: À dissiper la confusion:
Pas nécessaire pour les vecteurs de pointeurs ou de l'allocation dynamique.
Retour &iterator sera de retour l'adresse de l'itérateur. Si vous voulez retourner un moyen de faire référence à l'élément de retour de l'itérateur lui-même.
Méfiez-vous que vous n'avez pas besoin d'un vecteur à l'échelle mondiale afin de retourner l'itérateur/pointeur, mais que les opérations dans le vecteur peut invalider l'itérateur. Ajouter des éléments dans le vecteur, par exemple, peut déplacer les éléments du vecteur à un autre poste si la nouvelle taille() est plus grande que la mémoire réservée. La suppression d'un élément avant de l'élément donné du vecteur fera l'itérateur faire référence à un autre élément.
Dans les deux cas, en fonction de la STL mise en œuvre, il peut être difficile à déboguer avec juste les erreurs aléatoires qui se passe chaque tellement souvent.
MODIFIER après le commentaire: "oui, je ne voulais pas retourner l'itérateur a) parce que son const, et b) il est certainement seulement un local, temporaire itérateur? – Krakkos'
Les itérateurs ne sont pas plus ou moins locale temporaire ou de toute autre variable et ils sont copiable. Vous pouvez le retourner et de le compilateur va faire de la copie pour vous comme il le fera avec le pointeur.
Maintenant avec la const-ness. Si l'appelant veut effectuer des modifications via l'élément retourné (si le pointeur ou l'itérateur), alors vous devez utiliser un non-const itérateur. (Il suffit de retirer le 'const_" de la définition de la variable d'itération).
Ce n'est pas une bonne idée de retourner les itérateurs. Les itérateurs de devenir invalide lorsque des modifications pour le vecteur (inversion\suppression ) arrive. Aussi, l'itérateur est un objet créé sur la pile, et donc de retourner l'adresse de la même n'est pas du tout sûr. Je vous suggère de travailler avec myObject plutôt que vecteur d'itérateurs.
EDIT:
Si l'objet est léger alors il vaut mieux que vous de retour de l'objet lui-même. Otheriwise retour des pointeurs vers myObject stockées dans le vecteur.
Tant que vecteur reste dans la portée globale, vous pouvez retourner:
Je vais vous avertir que c'est assez dangereux en général. Si votre vecteur est jamais déplacé hors de portée mondiale et est détruite, tous les pointeurs à myObject devenir invalide. Si vous êtes à la rédaction de ces fonctions dans le cadre d'un projet plus vaste, de retour d'un non-const pointeur peut conduire quelqu'un à supprimer la valeur de retour. Ceci aura pas défini, et catastrophique, les effets sur la demande.
J'avais réécrire ce que:
Si vous avez besoin de modifier le retourné myObject, stocker vos valeurs en tant que pointeurs et les allouer sur le tas:
De cette façon, vous avez plus de contrôle quand ils sont détruits.
Quelque chose comme cela cassera votre application:
Vous pouvez utiliser le données fonction du vecteur:
Si vous ne voulez pas le pointeur vers le premier élément, mais par l'indice, alors vous pouvez essayer, par exemple:
Dire, vous avez les éléments suivants:
Alors le premier objet dans le vecteur est:
*first
. Pour obtenir l'adresse, utilisez:&(*first)
.Cependant, en accord avec la STL design, je te suggère de retourner un itérateur à la place si vous prévoyez de passer plus tard sur les algorithmes de la STL.
Vous de stocker les copies de la myObject dans le vecteur. Je crois donc que la copie de l'instance de monobjet est pas cher. Alors je pense que le plus sûr serait de renvoyer une copie de la myObject de votre fonction.
Reportez-vous à dirkgently et anon réponses, vous pouvez appeler la avant fonction au lieu de commencer de la fonction, de sorte que vous ne pas avoir à écrire de la
*
, mais seulement la&
.Exemple De Code:
Je ne suis pas sûr de retourner l'adresse de l'objet pointé par l'itérateur est nécessaire.
Tous vous avez besoin est le pointeur lui-même. Vous verrez STL classe iterator lui-même la mise en œuvre de l'utilisation de _Ptr à cette fin. Donc, il suffit de faire: