2016-09-01 7 views
-3

in der Standard-Map-Bibliothek C++, ein Aufruf an die Iterationsfunktionen gibt einen Iterator Zeiger,Warum werden Iteratoren als Wertobjekte notiert, aber als Zeiger referenziert?

std::map<int, int> map; 
std::map<int, int>::iterator ite = map.find(1); 

Aber, wenn der Iterator verwendet wird, es als eine Zeigervariable zugegriffen werden muss,

int first = ite->first; 
int second = ite->second; 

Warum ist das der Fall, wenn wir den erhaltenen Wert aus der find-Funktion in einen Nicht-Zeiger setzen? Sollte nicht die korrekte Syntax sein:

std::map<int, int>::iterator *pIte = map.find(1) 

oder wenn die ursprüngliche Syntax,

int first = ite.first; 
int second = ite.second; 

da wir Wert sind zu erhalten, und nicht einen Zeiger von der Rückgabewert der Funktion? Es ist auch nicht in der documentation geklärt. Warum ist das der Fall?

+0

Iteratoren * Akt * als Zeiger, und in einigen Fällen sind Zeiger. Ihre vorgeschlagene Syntax ist ein Zeiger auf einen Iterator. – jaggedSpire

+0

das gleiche haben Sie mit 'shared' und' unique_ptr' sie sind Objekte, die wie Zeiger, so dass dies beabsichtigt ist. – Hayt

Antwort

1

Als @jaggedSpire vorgeschlagen werden Iteratoren soll wie PTR handeln, *, ->, etc die Operatoren definiert haben. Aber ein Iterator ist kein expliziter Zeiger. Die von Ihnen vorgeschlagene Syntax lautet:

std::map<int, int>::iterator *pIte = map.find(1); 

Ist ein Zeiger auf einen Iterator, nicht nur einen Iterator. Der Grund, wenn Sie schrieb:

std::map<int, int>::iterator pIte = map.find(1); 

Sie schreiben: ite->first ist, weil operator-> für Iteratoren definiert ist. Dies bedeutet, dass Iteratoren wie Zeiger fungieren sollen.

+0

Ok, also ist es eigentlich kein Zeiger, nur ein Werttyp, der sich wie einer verhält. Ich verstehe immer noch nicht, warum es so umgesetzt wird, aber ich verstehe, wie es jetzt funktioniert. – iamseiko

+0

Hier sind einige weitere Lektüre @iamseiko: http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-iterator-define.html –

+0

das hilft.Demnach sind Iteratoren nur ein Typdef ihrer entsprechenden Objektzeiger, was viel sinnvoller ist. Vielen Dank. – iamseiko

0

Der Aufruf der Funktion

std::map<int, int>::iterator ite = map.find(1); 

kehrt Iterator, wie Zeiger verhält.

So müssen Sie die Syntax für den Zugriff auf Objekte verwenden Zeiger mit

int first = ite->first; 
int second = ite->second; 

Oder Sie könnten stattdessen schreiben

int first = (*ite).first; 
int second = (*ite).second; 

für Vergleichsbeispiel

#include <iostream> 
#include <iterator> 
#include <algorithm> 
#include <utility> 

int main() 
{ 
    const size_t N = 5; 
    std::pair<int, int> a[N] = { { 2, 2 }, { 4, 4 }, { 1, 1 }, { 3, 3 }, { 5, 5 } }; 

    std::pair<int, int> *it = std::find(std::begin(a), std::end(a), std::make_pair(1, 1)); 

    if (it != std::end(a)) 
    { 
     std::cout << it - a << ": " 
        << "{ " << it->first << ", " << it->second << " }" << std::endl; 
    } 

    return 0; 
} 

Die Programmausgabe ist

2: { 1, 1 } 

Hier it explizit wie ein Zeiger deklariert.