procurar vários indecies com reforço Multi-Index
-
10-07-2019 - |
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?)
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.