Ansatzfrage



  • Ich bemühe mich im Moment etwas hilflos eine Übersicht zur STL zu gewinnen und weiß nicht so recht ob es passende Container usw. für folgende (grob umrandete) Problemstellung gibt:

    Es gibt eine Referenzliste auf Datenelemente, wobei Referenzen in Vierergruppen eingetragen werden.
    Die Position der Datenelemente in ihrer Liste entspricht deren Referenzwert.
    Referenzwerte können dabei mehrfach in der Liste existieren, die eingetragenen Datenelemente sind jedoch einzigartig.

    Lese ich eine neue Vierergruppe von Datenelementen ein, wird gesucht ob eines davon bereits eingetragen ist.
    Ist dies der Fall, werden die anderen drei Datenelemente hinter diesem eingefügt ->Referenzen auf alle Datenelemente dahinter aktualisieren.
    Gleichzeitig werden auch die Referenzen auf die drei neuen Datenelementen an der entsprechenden Viererposition eingetragen.

    Vielen, vielen Dank für eure Hinweise!



  • Du kannst die stl-Container auch schachteln. Das könnte die evtl helfen.

    vector<vector<MeinTyp> > referenzliste;
    

    .

    Der innere Vektor enthält dann die 4 Referenzen, der äußere logischweise dann immer die Verbunde.
    Allerdings kann man an den inneren Vektor natürlich auch beliebieg viele Elemente anhängen. Also wenn die Begrenzung auf 4 innerhalb getestet werden soll, musst dir da ne eigene Klasse schreiben, die dann z.B. den Vektor enthält.



  • Oder, wenn es sowieso immer 4er-Gruppen sind, dann einfach

    vector<MyClass> benutzen, und MyClass halt ne Klasse bauen, die die vier Werte verwalten kann.



  • #include <algorithm>  // find
    #include <vector>
    #include <cstdlib>  // nur zur Demo; siehe get1von4
    
    struct Datenelement
    {
        Datenelement( int x = 0 ) : m_weisnich( x ) {}
        // --   ==-Operator für std::find
        bool operator==( const Datenelement& b ) const
        {
            return m_weisnich == b.m_weisnich;
        }
        int m_weisnich;
    };
    
    struct ReferenzListe
    {
        int m_idx[4];
    };
    
    Datenelement get1von4()
    {
        using namespace std;
        return Datenelement( int( 10 * double(rand())/(RAND_MAX + 1) ) );
    }
    
    int main()
    {
        using namespace std;
        std::vector< Datenelement > daten;
        std::vector< ReferenzListe > referenzen;
        for(;;) // <- bis irgendwann
        {
            // --   4'er Gruppe Datenelemente lesen
            ReferenzListe ref;
            for( int i=0; i<4; ++i )
            {
                Datenelement data = get1von4(); // <- gegen was Sinnvolles austauschen
                std::vector< Datenelement >::iterator j = find( daten.begin(), daten.end(), data );
                if( j == daten.end() ) // ist das ein neues Element?
                {
                    ref.m_idx[i] = int( daten.size() );
                    daten.push_back( data );
                }
                else  // nein, das ist schon drin
                {
                    ref.m_idx[i] = int( j - daten.begin() );
                }
            }
            referenzen.push_back( ref );  // 4er-Gruppe von Referenzen ablegen
        }
    }
    

    Gruß
    Werner


Anmelden zum Antworten