N:M Container



  • Hi,

    ich brauche einen Container, mit dem ich auf eine einfach Art und Weise N:M-Relationen abbilden kann, gemäß dem klassischen Fall Schüler:Kurse.
    Ich kenne eine mögliche Implementation so:

    class Pupil
    {
        void addToCourse( Course c )
        {
            if ( ! courses.contains( c ) )
                courses.push_back( c )
                c.addPupil( this )
        }
    
        void remFromCourse( Course c )
        {
            if ( courses.contains( c ) )
                courses.erase( c )
                c.remPupil( this )
        }
    
        Course[] courses
    }
    
    class Course
    {
        void addPupil( Pupil p )
        {
            if ( ! pupils.contains( p ) )
                pupils.push_back( p )
                p.addToCourse( this )
        }
    
        void remPupil( Pupil p )
            ...
    
        Pupil[] pupils
    }
    

    Den Code zur gegenseitigen "Synchronisation" würde ich gerne aus den eigentlichen Klassen raushalten, deshalb suche ich eine vorgefertigte, abstrahierende Lösung. Weiß da jemand was?



  • Es gab bei Sourceforge mal ne C++-Klasse aufgebaut wie ne (multi-)map mit dem netten kleinen Feature dass man auch das Mapping in die entgegengesetzte Richtung machen kann. Habs aber auf die Schnelle nicht gefunden.





  • boost::bimap sieht gut aus, dann hör ich erstmal auf, bei Sourceforge zu suchen 🙂 Leider gibt's bei boost mittlerweile so viel, dass ich da keinen richtigen Überblick mehr hab.. Danke euch!


  • Administrator

    Badestrand schrieb:

    boost::bimap sieht gut aus, dann hör ich erstmal auf, bei Sourceforge zu suchen 🙂

    Boost.MultiIndex wäre womöglich auch noch was, falls es ein wenig komplexer sein soll. Boost.Bimap baut auf Boost.MultiIndex auf, soweit ich das weiss 🙂

    Badestrand schrieb:

    Leider gibt's bei boost mittlerweile so viel, dass ich da keinen richtigen Überblick mehr hab..

    Hier hat man eine gute Übersicht:
    http://www.boost.org/libs/libraries.htm

    Es lohnt sich immer mal kurz drüber zu fliegen 😉
    Der Link leitet übrigens immer zur aktuellen Bibliothek weiter.

    Grüssli


Anmelden zum Antworten