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.
Version imprimable
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: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: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 :aie: .
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:
1
2
3
4 std::vector<pixel> v(15); .... for (int k =0 ; k!=15 ; ++k) v[k] = ...
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:
1
2
3 template<int N> Image median(const Image &X) {...} template<class F> Image median(const Image &X, F f) {...}