Domanda

come posso limitare la ricerca in un boost :: multi_index in base al risultato di una ricerca precedente? Ad esempio: supponiamo di avere una classe rettangolo con un valore interno come questo:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

e ho bisogno di una struttura di dati di tale oggetto per rispondere a domande come " dato un input_rectangle - quale oggetto MyRect è contenuto in quel rettangolo e ha il valore più alto? "

Potrei usare un 'multi_index' come questo:

    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;

Se il mio input_rectangle ha la larghezza input_width potrei usare qualcosa del genere:

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

Ma come posso limitare la ricerca dell'altezza del coresp da parte dei due iteratori indicati? (E dopo che trovare l'oggetto con il valore più alto in quel risultato?)

È stato utile?

Soluzione

Non credo che tu possa fare una limitazione sul posto.
Archivia gli iteratori risultanti della query sulle larghezze corrispondenti in un altro contenitore e usa quel contenitore per trovare le altezze corrispondenti con remove_if. Quindi utilizza max_element per trovare il più grande.

Se si memorizzano gli elementi come puntatori, è possibile utilizzare lo stesso MIC per memorizzare i risultati.

Altri suggerimenti

Se capisco correttamente il tuo problema, potrebbe esserci una soluzione più semplice. Inserisci MyRects in un set STL ordinato in base al valore (devi definire un operatore di confronto o una funzione di confronto personalizzata). È possibile creare un predicato personalizzato e utilizzarlo per verificare se un determinato MyRect rientra in un determinato intervallo. Quindi si utilizza l'algoritmo STL find_if e si passa il predicato personalizzato. Se ti assicuri che attraversi la sequenza in ordine decrescente (ad esempio utilizzando reverse_iterator), dovrebbe restituire MyRect che stai cercando.

Spero che sia comprensibile e si applichi al tuo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top