C'est 3 itérateurs en paramètre, donc le 2ème est un itérateur/pointeur vers l'élément que tu veux récupérer.
C'est 3 itérateurs en paramètre, donc le 2ème est un itérateur/pointeur vers l'élément que tu veux récupérer.
Un truc comme ça :
Il ne me donne plus d'erreur, mais je ne sais pas si ça fonctionne effectivement...
Code : Sélectionner tout - Visualiser dans une fenêtre à part nth_element(v.begin(), v.begin()+(v.size()/2), v.end());
Je récupère, à l'issue de cet appel, ma valeur via un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part val = v[v.size()/2];
Si tu n'as pas confiance, fais des tests pour vérifier. D'ailleurs, même si tu as confiance, tu devrais faire des tests pour vérifier.
Ca a l'air de marcher, mais je suis surpris, ça me semble trop simple.
Ah
Non, rassure-toi, c'est normal.
Et oui, la SL c'est simple au fond.
Mais comme l'a souligné Charlemagne, pour des petites structures, d'autres algos peuvent s'avérer plus efficace.
Au fait, empty() ne vide rien. C'est clear() qui fait ça. Mais ne t'embête pas avec ça. La taille de ton filtre est toujours la même. Ici, le remplissage par indices sera bien plus efficace.
->
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::vector<pixel> v(15); .... for (int k =0 ; k!=15 ; ++k) v[k] = ...
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
C'est là où c'est sournois. Au bord, le filtre n'a pas la même taille.
Est-ce que si j'utilise le conteneur associatif set, qui d'après ce que j'ai compris insère les éléments de manière ordonnée, je peux faire cela plus rapidement qu'avec le vecteur suivi d'un tri ?
Dans quel cas vaut-il mieux utiliser l'un que l'autre ?
L'accès dans un set est en log(n), l'accès adans un vecteur est en O(1)
C'est avantageux de prendre un set si les copies sont trop coûteuses lors du tri du vecteur. Dans ton cas, il faudrait faire un test et prendre le meilleur.
Dans tous les cas, toujours faire des tests pour vérifier ce qu'on avance.
Je crois qu'un 'set' ne ferait pas l'affaire, mais plutôt 'multiset'.
Mais, c'est pas évident de retrouver l'élément du milieu, ni d'en retirer des éléments au fur et à mesure que le filtre avance sur l'image.
Et puis je suis pas convaincu que le l'insertion soit rapide puisque la dichotomie marche probablement avec des sauts conditionnels, qui casseraient le pipeline. (le problème existe aussi quand on choisit un vecteur à la place d'un set)
Bref, perso, je ne miserais pas la dessus pour optimiser un filtre médian, même si un algo insérant et retirant progressivement les éléments a très probablement un avantage sur la fonction 'sort'.
Si je voulais concevoir un algo rapide je miserais sur des fenêtres de tailles fixes et sur les instructions vectorielles.
Bon, maintenant si le paramétrage de la taille du filtre est également important, je m'arrangerais pour paramétrer la fonction médian soit par un template entier, soit par une fonction objet représentant le filtre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 template<int N> Image median(const Image &X) {...} template<class F> Image median(const Image &X, F f) {...}
Partager