Pergunta

como faço para limitar a pesquisa em um boost::multi_index pelo resultado de uma pesquisa anterior? Como um exemplo: suponha que eu tenho uma classe retângulo com um valor interno como esta:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

e eu preciso de uma estrutura de dados de tal objeto para consultas resposta como "dado um input_rectangle - qual o MyRect objeto está contido nessa retângulo e tem o maior valor"

Eu poderia usar um 'multi_index' assim:

    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 o meu input_rectangle tem input_width largura eu poderia usar algo como isto:

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

Mas como faço para limitar a pesquisa para a altura coresp pelos dois iteradores dadas? (E depois que encontrar o objeto com o maior valor do resultado?)

Foi útil?

Solução

Eu não acho que você pode fazer uma limitação inplace.
Armazenar os iteradores resultantes da consulta larguras correspondentes em outro recipiente e usar esse recipiente para encontrar as alturas de harmonização com remove_if. Em seguida, use max_element para encontrar o maior.

Se você armazenar os elementos como ponteiros, você poderia usar o mesmo MIC para armazenar os resultados.

Outras dicas

Se eu entender o seu problema corretamente, pode haver uma solução mais simples. Basta colocar seus MyRects em um STL-Set ordenados pelo seu valor (necessidade de definir operador de comparação ou função de comparação personalizada). O que você pode criar um predicado que e uso personalizado que verifica se um determinado MyRect está dentro de um determinado intervalo. Então você usa o find_if STL-Algorithm, e entregá-lo o predicado personalizado. Se você se certificar de que ele percorre a seqüência em ordem decrescente (por exemplo, usando reverse_iterator), ele deve retornar a MyRect que você está procurando.

A esperança que é compreensível e se aplica ao seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top