std::vector - Verschachteltes Problem
-
std::vector<Objects>::iterator iObject; for( iObject = objects.begin( ); iObject < objects.end( ); ++iObject ) { for( std::vector<Faces>::iterator iFace = iObject->faces.begin( ); iFace != iObject->faces.end( ); ++iFace ) { for( std::vector<Vertices>::iterator iVert = iObject->vertices.begin( ); iFace != iObject->vertices.end( ); ++iVert ) { } } }-->
std::vector<Objects>::iterator iObject; typedef std::vector<Faces> FacesType; typedef std::vector<Vertices> VerticesType; for( iObject = objects.begin( ); iObject < objects.end( ); ++iObject ) { for( FacesType::iterator iFace = iObject->faces.begin( ); iFace != iObject->faces.end( ); ++iFace ) { for( VerticesType::iterator iVert = iObject->vertices.begin( ); iFace != iObject->vertices.end( ); ++iVert ) { } } }Aber das ist genau das, was Unskilled und ich vorhin gepostet habe..
-
Dann muss ich irgendetwas falsch verstanden haben. Läuft nun, danke.
-
@Kóyaánasqatsi,
Geht doch
Aber wie drakon sagt, das ist genau das, was bereits vorgeschlagen wurde.
Man kann dies allerdings noch ein wenig unabhängiger machen, indem man ein paar
typedefeinführt.struct Object { ~Object() { objectName.clear( ); faces.clear( ); vertices.clear( ); } typedef std::vector<Face> FaceContainer; typedef std::vector<Vertex> VertexContainer; std::string objectName; FaceContainer faces; VertexContainer vertices; }; // ... std::vector<Object> objects; typedef std::vector<Object>::iterator ObjectIterator; // Es ist uns egal, was für ein Container dahinter liegt: typedef Object::FaceContainer::iterator FaceIterator; typedef Object::VertexContainer::iterator VertexIterator; // Der Rest halt wie es gezeigt wurde. // Ein Typ ist übrigens nie von einer Variablen abhängig, sondern grundsätzlich // immer von Typen oder Konstanten.Wieso sind eigentlich deine Klassennamen in der Mehrzahl angegeben? Empfinde ich als ziemlich unüblich.
Grüssli
-
Dein Quelltext is übrigens.... zumindest komisch

dtor is nicht notwendigund bei iteratoren < zu nehmen anstatt != ist auch nich gerade sinnvoll... so bald du von vector auf nen anderen container umsteigst, kannst du nämlich alles ändern...
auch find ich variablen-namen á lastd::vector<Faces> faces;total hässlich... wahrscheinlich würde die klasse an sich besser Face heißen... Darunter kann ich mir zwar jz auch nur begrenzt etwas vorstellen, aber es macht zumindest mehr sinn als vector<faces> faces...und jeden schleifendurchlauf wieder end() zu bestimmen ist auch nich gerade sehr doll - ich weiß nämlich nich, in wie fern der compiler das wegoptimieren kann...
bb
-
Ich danke euch für die hilfreichen Tips
. Würde mich über mehr Kritisierungen freuen
.
-
unskilled schrieb:
und jeden schleifendurchlauf wieder end() zu bestimmen ist auch nich gerade sehr doll - ich weiß nämlich nich, in wie fern der compiler das wegoptimieren kann...
Wird zumindest schwierig, das wegoptimieren zu lassen. Wenn man selber genau weiß dass man den Container nicht verändert (d.h. dass end() immer denselben Iterator liefern wird), dann kann man ja auch problemlos eine zweite Variable im Schleifenkopf definieren:
for( FacesType::iterator iFace = iObject->faces.begin( ), last = iObject->faces.end(); iFace != last; ++iFace)
-
pumuckl schrieb:
unskilled schrieb:
und jeden schleifendurchlauf wieder end() zu bestimmen ist auch nich gerade sehr doll - ich weiß nämlich nich, in wie fern der compiler das wegoptimieren kann...
Wird zumindest schwierig, das wegoptimieren zu lassen. Wenn man selber genau weiß dass man den Container nicht verändert (d.h. dass end() immer denselben Iterator liefern wird), dann kann man ja auch problemlos eine zweite Variable im Schleifenkopf definieren:
for( FacesType::iterator iFace = iObject->faces.begin( ), last = iObject->faces.end(); iFace != last; ++iFace)jopp - so hab ichs ja auch gemacht - allerdings finde ich "last" (hier) ein wenig unpassend

bb
-
unskilled schrieb:
jopp - so hab ichs ja auch gemacht - allerdings finde ich "last" (hier) ein wenig unpassend

War angelehnt an die diversen Beispiele aus cpluslus.com wo die ganzen Algos mit [first,last)-Iteratorpaaren laufen. Man kann das Ding natürlich auch end oder sonstwie nennen
