Pregunta

¿Cómo limito la búsqueda en un boost :: multi_index por el resultado de una búsqueda previa? Como ejemplo: supongamos que tengo una clase de rectángulo con un valor interno como este:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

y necesito una estructura de datos de dicho objeto para responder consultas como " dado un input_rectangle : ¿qué objeto MyRect está contenido en ese rectángulo y tiene el valor más alto? "

Podría usar un 'multi_index' como este:

    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;

Si mi input_rectangle tiene ancho input_width podría usar algo como esto:

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

¿Pero cómo limito la búsqueda de la altura del núcleo por los dos iteradores dados? (¿Y luego encuentra el objeto con el valor más alto en ese resultado?)

¿Fue útil?

Solución

No creo que puedas hacer una limitación in situ.
Almacene los iteradores resultantes de la consulta de anchos coincidentes en otro contenedor y use ese contenedor para encontrar las alturas coincidentes con remove_if. Luego use max_element para encontrar el más grande.

Si almacena los elementos como punteros, podría usar el mismo MIC para almacenar los resultados.

Otros consejos

Si entiendo su problema correctamente, puede haber una solución más simple. Simplemente coloque sus MyRects en un conjunto STL ordenado por valor (necesita definir un operador de comparación o una función de comparación personalizada). Puede crear un predicado personalizado que y usar que verifique si un determinado MyRect está dentro de un cierto rango. Luego usa el algoritmo STL find_if y le entrega el predicado personalizado. Si se asegura de que atraviesa la secuencia en orden decreciente (por ejemplo, utilizando reverse_iterator), debería devolver el MyRect que está buscando.

Espero que sea comprensible y se aplique a su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top