Kann die Adresse die ein Iterator beinhaltet nicht ausgeben



  • Hallo,

    mir ist letztens aufgefallen das ich die Adresse die ein Iterator beinhaltet nicht ausgeben kann.
    Hier mal folgender Beispiel Code:

    vector<int> intvec;
        intvec.push_back(30);
        intvec.push_back(40);
        intvec.push_back(50);
    
        vector<int>::iterator coniter = intvec.begin();
        cout << *coniter << endl;   //dereferenziert 30
        cout << coniter << endl;    //addresse von intvec[0]
        cout << &coniter << endl;   //addresse von iterator coniter
    

    In der vorletzten Zeile gibt es einen compilerfehler.
    Wenn ich die vorletzte Zeile durch diese hier ersetze:

    cout << &(*coniter) << endl;    //addresse von intvec[0]
    

    wird das Programm compiliert. Die sollte doch mit der vorherigen äquivalent sein? oder?
    coniter wird hier dereferenziert um dann das Objekt zu referenzieren.
    Also gibt diese Zeile die Adresse des Objekts intvec[0] aus.
    Warum also ist

    cout << coniter << endl;
    

    ein Fehler?



  • ne sollt es nicht. ein iterator ist eben nicht grundsätzlich ein zeiger. was hat es eigentlich für einen sinn die adresse des ziels des iterators auszugeben?


  • Mod

    Du versuchst den Iterator selbst auszugeben. Es gibt keine vordefinierte Ausgabefunktion für Iteratoren, denn diese Aktion macht selten Sinn. Ein Iterator kann so etwas wie eine Adresse sein oder intern eine Adresse beinhalten, im Allgemeinen ist dies aber nicht unbedingt der Fall. Selbst wenn der Iterator irgendwie mit Adressen arbeitet, ist der Iterator selber keine Adresse, sondern eben ein Iterator.



  • Ok! Danke für die Antworten! Ich war nur ein bischen am rumspielen und habe mich halt gewundert warum es nicht funktionierte.



  • ostream &operator <<(ostream &os, const decltype(vector<int>().begin()) &it){
    	return os << &(*it);
    }
    
    int main(){
    	vector<int> intvec;
    	intvec.push_back(30);
    	intvec.push_back(40);
    	intvec.push_back(50);
    
    	vector<int>::iterator coniter = intvec.begin();
    	cout << *coniter << endl;   //dereferenziert 30
    	cout << coniter << endl;    //addresse von intvec[0]
    	cout << &coniter << endl;   //addresse von iterator coniter
    }
    

    Was nicht passt wird passend gemacht. Für sowas liebe ich C++. 😃



  • Und damit könntest du dir an ganz anderer Stelle im Programm das ganze Bein wegballern...


Anmelden zum Antworten