2009-02-27 16 views
1
std::vector< std::vector<coords> >::iterator iter; 
for(iter = characters.begin(); iter != characters.end(); iter++) 
{ 
    std::vector<coords>* cha = iter; // doesn't work. 
} 

// does work. 
std::vector<coords>* character = &characters.at(0); 
coords* first = &character->at(0); 

Und ich verstehe nicht warum. Soll es sich nicht um einen Zeiger auf ein Element des Typs handeln, den der Container "enthalten" soll?Zugriff auf Vektorelemente in einem anderen Vektor durch einen Iterator?

Wer will das beleuchten?

Durch funktioniert nicht ich meine:

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *' 

, die eine ganze Menge Sinn für mich nicht machen.

Antwort

6

Ein Iterator ist ein Typ, der wie ein Zeiger dereferenziert werden kann, d. H. Er hat eine explizite operator*() und operator->(). Es muss kein Zeiger sein.

Verwenden Sie also &*iter, wenn Sie die Adresse des Vektors erhalten möchten.

3

Um weiter auf MSN's Antwort zu klären, können Sie sich den Iterator als Wrapper für ein einzelnes Element des Containers vorstellen, aber es hat auch einige Smarts zum Inkrementieren (++ iter), Dekrementieren (++ iter) usw. Beachten Sie, dass die zugrunde liegende Datenstruktur abhängig vom Containertyp/der Implementierung möglicherweise kein zusammenhängender Speicherblock ist. Um den tatsächlichen Wert zuzugreifen, können Sie

1) derefence Iterator, zB

Type t = *iter;

2) behandeln den Iterator als Zeiger auf den Behältertyp, zB

iter->someFuncOnTheContainerType();

1

Ich weiß, es ist jetzt offensichtlich (im Nachhinein), aber in Ihrer for-Schleife könnten Sie auch versuchen:

std::vector<coords> & cha = * iter; 

Auch, was Sie nicht fragen, und nur FYI, aber Vektoren unterstützen Random Access Iteratoren. Das heißt, Sie könnten auch schreiben:

for(size_t i=0; i<characters.size(); i ++) 

Und wenn Sie zurück zu einem Iterator konvertieren benötigt, könnten Sie verwenden:

characters.begin() + i 

Es ist nicht die C++ Art und Weise, Dinge zu tun, es bricht die allgemeine Iterator Philosophie, aber es hat seine Verwendung.

Verwandte Themen