Frage

Wie begrenzen wir die Suche in einem boost::multi_index durch das Ergebnis einer vorherigen Suche? Als ein Beispiel: Angenommen, ich ein Rechteck-Klasse mit einem internen Wert wie folgt aussehen:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

und ich brauche eine Datenstruktur eines solchen Objekts Fragen zu beantworten wie „ein input_rectangle gegeben - die MyRect Objekt in diesem Rechteck enthalten ist, und hat den höchsten Wert“

Ich könnte eine 'multi_index' wie folgt verwenden:

    struct given_value{};
    struct given_width{};
    struct given_height{};

    typedef multi_index_container<MyRect,
        indexed_by<
            ordered_non_unique< tag<given_value>, 
                member<MyRect, double, &MyRect::value>,
            ordered_non_unique< tag<given_width>, 
                member<MyRect, int, &MyRect::width>,
            ordered_non_unique< tag<given_height>, 
                member<MyRect, int, &MyRect::height>, >
        >
    > MyDataStructure;

    typedef MyDataStructure::index<given_width>::type MyDataStructureGivenWidth;
    typedef MyDataStructureGivenWidth::iterator WidthIterator;

Wenn meine input_rectangle Breite input_width habe ich so etwas wie dieses verwenden:

WidthIterator start_iter = data_object.get<given_width>().begin();
WidthIterator end_iter   = data_object.get<given_width>().upper_bound(input_width);

Aber wie beschränke ich die Suche nach dem coresp Höhe von den beiden gegeben Iteratoren? (Und danach finden Sie das Objekt mit dem höchsten Wert in diesem Ergebnis?)

War es hilfreich?

Lösung

Ich glaube nicht, Sie können eine Inplace Einschränkung tun.
Speichern Sie die resultierenden Iteratoren der Anpassungsbreiten Abfrage in einem anderen Behälter und verwenden Sie diese Behälter die passenden Höhen mit remove_if zu finden. Dann nutzen Sie max_element die größte zu finden.

Wenn Sie die Elemente als Zeiger speichern, könnten Sie die gleiche MIC verwenden, um die Ergebnisse zu speichern.

Andere Tipps

Wenn ich verstehe Ihr Problem richtig, kann es eine einfachere Lösung sein. Legen Sie einfach Ihre MyRects in ein STL-Set nach Wert geordnet (müssen Vergleichsoperator oder benutzerdefinierte Vergleichsfunktion definieren). Das können Sie eine benutzerdefinierte Prädikat erstellen und zu verwenden, die überprüft, ob eine gegebene MyRect innerhalb eines bestimmten Bereichs liegt. Dann verwenden Sie die STL-Algorithmus find_if, und geben ihm das benutzerdefinierte Prädikat. Wenn Sie sicherstellen, dass es die Sequenz in absteigender Reihenfolge durchläuft (zum Beispiel durch reverse_iterator verwendet wird), sollte es die MyRect kehren Sie auf das Bild.

Hope, die verständlich ist und gilt für Ihr Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top