Question

comment limiter la recherche dans un boost :: multi_index par le résultat d'une recherche précédente? A titre d'exemple: supposons que j'ai une classe rectangle avec une valeur interne comme ceci:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

et j'ai besoin de la structure de données d'un tel objet pour répondre à des requêtes du type "étant donné un input_rectangle - quel objet MyRect est contenu dans ce rectangle et a la valeur la plus élevée? "

Je pourrais utiliser un 'multi_index' comme ceci:

    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 mon input_rectangle a la largeur input_width , je pourrais utiliser quelque chose comme ceci:

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

Mais comment limiter la recherche de la hauteur de coresp par les deux itérateurs donnés? (Et après cela trouver l'objet avec la plus haute valeur dans ce résultat?)

Était-ce utile?

La solution

Je ne pense pas que vous puissiez faire une limitation in-situ.
Stockez les itérateurs résultants de la requête de largeur correspondante dans un autre conteneur et utilisez-le pour rechercher les hauteurs correspondantes avec remove_if. Ensuite, utilisez max_element pour trouver le plus gros.

Si vous stockez les éléments en tant que pointeurs, vous pouvez utiliser le même MIC pour stocker les résultats.

Autres conseils

Si je comprends bien votre problème, il pourrait y avoir une solution plus simple. Il suffit de placer vos MyRects dans un ensemble STL classé par valeur (nécessité de définir un opérateur de comparaison ou une fonction de comparaison personnalisée). Vous pouvez créer un prédicat personnalisé qui et utiliser qui vérifie si un MyRect donné se situe dans une certaine plage. Ensuite, vous utilisez l'algorithme STL find_if et lui remettez le prédicat personnalisé. Si vous vous assurez qu'il parcourt la séquence dans l'ordre décroissant (par exemple, en utilisant reverse_iterator), il devrait renvoyer le MyRect que vous recherchez.

J'espère que cela est compréhensible et s'applique à votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top