std::vector - Verschachteltes Problem



  • unskilled schrieb:

    @drakon:
    Japp ^^ Hatte ich mir auch so gedacht : D

    Vor allem, da wir auch beide std::vector<int> genommen haben etc : D

    Aber du kannst ruhig zugeben, dass du die 4 Sekunden genutzt hast, um es zu copy&pasten und noch schnell zu ändern 😉 😃

    bb

    So etwas musste ja noch kommen.. -.-

    Aber im Ernst, ich glaube die 4 Sekunden, die ich später kam, habe ich damit vergeudet nachzudenken, ob ich auch ein typedef machen soll.. :p



  • Ähhhm, moment mal. Die Vektoren in der Struktur beziehen sich wieder auf Strukturen (^^). Und das Problem ist, dass die Vektoren in der Struktur von dem Vektor der Struktur abhängig sind. Sprich: Pro Element des Vektors der Struktur müssen 2 neue Iteratoren für die 2 Vektoren in der Struktur angelegt werden. Und da lag ich gar nicht mal so falsch... Ich hoffe das hat jetzt irgendwie einer verstanden. 😞 .
    Danke



  • Ich glaube kein Mensch versteht was du willst.

    Poste doch bitte etwas Code, und bitte nicht "vereinfachten" (sprich: Quatsch), sondern konkret deine Strukturen und Vektoren.

    Die Schleife um da drüber zu iterieren sollte trivial sein, aber zu erraten was du meist ist ganz sicher nicht trivial.



  • Kóyaánasqatsi sieh es doch einfach ein, C++ ist eine aussterbende Sprache. Es gibt keine Experten mehr die dein Problem lösen könnten, die sind alle schon auf die Sprachen der Zukunft umgestiegen.


  • Administrator

    @Kóyaánasqatsi,
    1. Probier dich mal ein wenig korrekter auszudrücken. Ein std::vector bezieht sich nicht auf eine Struktur, sondern er beinhaltet Objekte von einer Klasse.
    2. "Es gibt eine Struktur, mit einer Struktur, der Struktur durch eine Struktur und Struktur. Wie kann ich die Struktur realisieren." Das kann doch niemand lesen 😃
    Du kannst schon vereinfachen, aber gibt den Klassen sprechende Namen. Vor allem wenn du ein Beispiel schaffst, in dem das Konstrukt reinpasst, ist dies sehr hilfreich. Also zum Beispiel:
    "Die Klasse Auto hat einen Motor und einen std::vector , welcher die Räder beinhaltet."
    Notfalls erkläre es mit dem, was tatsächlich vorhanden ist. Wir sind ja nicht dumm und wenn du uns ein wenig Erklärung gibst, dann können wir dies nachvollziehen.
    Ich verweise da auch mal auf einen wichtigen Thread in diesem Forum:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html

    Frage nach dem, was du erreichen willst und nicht danach womit du es erreichen willst.

    Grüssli



  • Dravere schrieb:

    "Die Klasse Auto hat einen Motor und einen std::vector, welcher die Räder beinhaltet."

    ...

    hustbaer schrieb:

    Ich glaube kein Mensch versteht was du willst.

    Glaube ich auch. Ich denke ich poste mal den kompletten zusammengehörigen Code, bevor ihr mir hier weiter mit der Schübbe au'n Kopp haut...

    Die Grundstruktur:

    #pragma pack( 1 )
    struct Objects
    {
    	~Objects()
    	{
    		objectName.clear( );
    		faces.clear( );
    		vertices.clear( );
    	}
    
    	std::string objectName;
    	std::vector<Faces> faces;
    	std::vector<Vertices> vertices;
    };
    #pragma pack( )
    

    Faces und Vertices ist eine andere Struktur, aber die sollte erstmal unwichtig seien.

    std::vector<Objects> objects;
    

    Unser Vektor der sich auf die Struktur bezieht...

    Und das letztendliche durchiterieren:

    std::vector<Objects>::iterator iObject;
    
    	for( iObject = objects.begin( ); iObject < objects.end( ); ++iObject )
    	{
    		for( std::vector<Faces>::iterator iFace = objects[*iObject].faces.begin( ); iFace < objects[*iObject].faces.end( ); ++iFace )
    		{
    			for( std::vector<objects[*iObject].vertices>::iterator iVert = objects[*iObject].vertices.begin( ); iFace < objects[*iObject].vertices.end( ); ++iVert )
    			{
    			}
    		}
    	}
    

    Danke.



  • 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.


  • Administrator

    @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 typedef einfü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 notwendig

    und 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 á la std::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 🙂


Anmelden zum Antworten