Welchen Container?



  • Shade Of Mine schrieb:

    Dann würde ich einfach einen vector nehmen und per find/find_if vorher prüfen ob der Filter schon vorhanden ist.

    Das dürfte bei wenigen Einträgen auf jeden Fall am effizientesten sein. Wenn es denn mal mehr werden, dürfte eine Kombination schneller sein (messen!): ein std::set zum Prüfen auf doppelte Einträge, zusätzlich ein std::vector für die Reihenfolge.


  • Mod

    multi_index_container<foo, indexed_by<sequenced<>, ordered_unique<identity<foo>>>>



  • Shade Of Mine schrieb:

    Sone schrieb:

    Mein Vorschlag:
    std::set mit einem Compare-Funktor der einfach immer true zurück gibt. Der Witz ist jetzt, das als letztes eingefügte Element ist an Stelle eins ( ➡ die Reihenfolge ist verkehrt ⚠ ):

    Denk da nochmal drüber nach.

    Was passiert wenn ich 1,2,3,1,2,3,1,2,3 einfüge?

    Shit... 😃
    Ich versuch mal was anderes.

    Edit: Camper ist wieder der King... auf Boost.MultiIndex wär' ich nich' gekommen.



  • Sone schrieb:

    Edit: Camper ist wieder der King... auf Boost.MultiIndex wär' ich nich' gekommen.

    Davon bin ich noch nicht überzeugt. Du darfst aber gerne ein paar Messungen vornehmen.



  • Was haltet ihr davon?

    #include <algorithm>
    
    template<typename Container>
    Container& unique(Container& v)
    {
            typename Container::iterator iter = v.begin();
    
            while(++iter != v.end())
                    if(std::find(v.begin(), iter, *iter) != iter)
                            iter = --v.erase(iter);
    
            return v;
    }
    

    Kann man ja drüber laufen lassen, bevor man damit arbeitet.

    @Michael: Muss ich das machen? 😞


  • Mod

    Sone schrieb:

    Was haltet ihr davon?

    Unnütz und ineffizient

    Kann man ja drüber laufen lassen, bevor man damit arbeitet.

    Und wenn man es vergisst? Was nützt mir ein Container, den ich Babysitten muss?



  • SeppJ schrieb:

    Kann man ja drüber laufen lassen, bevor man damit arbeitet.

    Und wenn man es vergisst? Was nützt mir ein Container, den ich Babysitten muss?

    Shade Of Mine schrieb:

    Dann würde ich einfach einen vector nehmen und per find/find_if vorher prüfen ob der Filter schon vorhanden ist.



  • Dir ist schon klar dass man diesen vector mit den find vor dem insert wrappen kann?

    Es gibt btw std::unique...

    Egal was man macht, der beste Ansatz ist idR sich beim einfügen dranzuhängen. Damit ist der Container immer in einem korrekten Zustand.

    Und man kapselt funktionalität. Damit kann man die Implementierung ändern, wenn es notwendig wird.



  • Shade Of Mine schrieb:

    Es gibt btw std::unique...

    Macht btw nicht das was meins tut...

    Aber gut! Wenn du meinst dass das die beste Lösung ist, wirds so sein.



  • Sone schrieb:

    Shade Of Mine schrieb:

    Es gibt btw std::unique...

    Macht btw nicht das was meins tut...

    Naja... Schon irgendwie, auch wenn Details unterschiedlich sind.
    Ein inplace erase ist idR aber keine gute Idee.



  • Shade Of Mine schrieb:

    Dir ist schon klar dass man diesen vector mit den find vor dem insert wrappen kann?

    Und das kann man mit meiner Version nicht? 😕



  • Sone schrieb:

    Shade Of Mine schrieb:

    Dir ist schon klar dass man diesen vector mit den find vor dem insert wrappen kann?

    Und das kann man mit meiner Version nicht? 😕

    Dein Unique muss explizit aufgerufen werden. Das ist das Problem an der Sache - SeppJ hat das "Babysitten des Containers" genannt. Egal wie du es implementierst - ein Container den ich explizit in den korrekten Zustand bringen muss ist meh.


Anmelden zum Antworten