Opérateur d'incrémentation/ itérateur de mise en œuvre
Je suis à essayer de comprendre deux choses ici:
- Comment puis-je écrire un opérateur d'incrémentation pour une classe de nœud qui a un pointeur vers le nœud suivant?
- Comment puis-je mettre en œuvre les itérateurs pour une classe comme ci-dessous?
#include <iostream> #include <vector> using namespace std; template <typename T> class Node { public: Node(int i=0):val(i) {} Node*& operator++(int i=0) {return next;}; T val; Node *next; }; //================================================ int main() { Node<int> *head, *tmp1, *tmp2; tmp1 = new Node<int>(0); head = tmp1; for (int i=1; i<10; ++i) { tmp2 = new Node<int>(i); tmp1->next = tmp2; tmp1 = tmp2; } while (head != NULL) { cout << head->val << " '"; head = head->operator++(0); //How do I make it work with ++head;? } }
Ce n'est pas un bon exemple pour démontrer la surcharge d'opérateur ou d'itérateurs.
Vous ne pouvez pas. la tête est un pointeur et ++ opérateur est builtin/défini pour les pointeurs. Si la tête est celle d'un objet ou d'une référence à un objet, alors vous pourriez le faire.
hmm..ok. Connaissez-vous des liens vers des textes itérateurs? Merci
Vous pouvez consulter les réponses à cette question: stackoverflow.com/questions/3582608/...
comme vous l'avez suggéré découlant STL itérateurs j'étais en train de regarder l'exemple à cplusplus.com/reference/std/iterator/iterator. Donc, si je veux lire et à écrire, dois-je simplement utiliser random_access_iterator_tag ? ou recommandez-vous?
Je recommande de commencer à partir de boost::iterator_facade, qui permet de fournir une partie de l'infrastructure que de la bonne itérateurs besoin. Il a même un tutoriel qui va avec.
hmm..ok. Connaissez-vous des liens vers des textes itérateurs? Merci
Vous pouvez consulter les réponses à cette question: stackoverflow.com/questions/3582608/...
comme vous l'avez suggéré découlant STL itérateurs j'étais en train de regarder l'exemple à cplusplus.com/reference/std/iterator/iterator. Donc, si je veux lire et à écrire, dois-je simplement utiliser random_access_iterator_tag ? ou recommandez-vous?
Je recommande de commencer à partir de boost::iterator_facade, qui permet de fournir une partie de l'infrastructure que de la bonne itérateurs besoin. Il a même un tutoriel qui va avec.
OriginalL'auteur blueskin | 2010-12-01
Vous devez vous connecter pour publier un commentaire.
Vous ne mettez pas en œuvre
operator++
pour la classe de Nœud; mettre en œuvre pour l'itérateur. La classe iterator devrait être une classe à part.Et s'il vous plaît, ne gâchez pas votre modèle en faisant des hypothèses (depuis
val
est unT
, votre constructeur doit accepter unT
, pas unint
). Aussi, ne pas ignorer leint
paramètre de l'opérateur++ comme ça: c'est un mannequin utilisé pour distinguer la pré-incrémentation de la mise en œuvre de la post-incrémentation de la mise en œuvre.C'est encore un long, long chemin de fournir une encapsulation des données, gestion de la mémoire etc. Faire une bonne liste liée classe est pas facile. C'est pourquoi la bibliothèque standard fournit un. Ne pas réinventer la roue.
en.literateprograms.org/Singly_linked_list_%28C_Plus_Plus%29 est plus utile
Pourquoi ne opérateur++() renvoie une référence const et l'opérateur++(int) renvoie une valeur?
Je ne sais pas pour vous, mais je pense que c'est parce que dans la post-incrémentation, vous devez retourner la valeur qui existait avant l'incrémentation, alors que la pré-incrémentation retourne const référence à l'itérateur parce qu'il est utilisé uniquement pour l'avancement de l'itérateur. Notez que la post-incrémentation utilise également pré-incrémentation à l'avance l'itérateur.
vous avez tout à fait raison.
OriginalL'auteur Karl Knechtel