Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1)
pour désigner les 2 sommets d'un segment ? Y'a-t-il une raison pour laquelle il
n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) p uis *(++ipv1) pour désigner les 2 sommets d'un segment ? Y'a-t-il une rai son pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
C'est non seulement moche et illisible mais ça donne surtout un comportement indéfini - il n'y a pas de "points de séquence" entre les évaluations des arguments lors de l'appel d'une fonction, donc on ne sait pas dans quel ordre les ++ et -- sont appliqués.
Une solution possible :
template<typename Iter> inline Iter predecessor(Iter it) { return --it; }
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) p uis
*(++ipv1) pour désigner les 2 sommets d'un segment ? Y'a-t-il une rai son
pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal
iterators ?
C'est non seulement moche et illisible mais ça donne surtout un
comportement indéfini - il n'y a pas de "points de séquence"
entre les évaluations des arguments lors de l'appel d'une fonction,
donc on ne sait pas dans quel ordre les ++ et -- sont appliqués.
Une solution possible :
template<typename Iter> inline Iter predecessor(Iter it)
{
return --it;
}
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) p uis *(++ipv1) pour désigner les 2 sommets d'un segment ? Y'a-t-il une rai son pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
C'est non seulement moche et illisible mais ça donne surtout un comportement indéfini - il n'y a pas de "points de séquence" entre les évaluations des arguments lors de l'appel d'une fonction, donc on ne sait pas dans quel ordre les ++ et -- sont appliqués.
Une solution possible :
template<typename Iter> inline Iter predecessor(Iter it) { return --it; }
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1) pour désigner les 2 sommets d'un segment ?
Voir std::advance
Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
Parce que la complexite ne serait pas en temps constant.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis
*(++ipv1) pour désigner les 2 sommets d'un segment ?
Voir std::advance
Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour
les Bidirectionnal iterators ?
Parce que la complexite ne serait pas en temps constant.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1) pour désigner les 2 sommets d'un segment ?
Voir std::advance
Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
Parce que la complexite ne serait pas en temps constant.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Aurélien Barbier-Accary
template<typename Iter> inline Iter predecessor(Iter it) { return --it; }
Merci. Je trouve étrange qu'une telle fonction n'existe pas de base dans la STL !?!!
-- Aurélien Barbier-Accary
Aurélien Barbier-Accary
Aurélien Barbier-Accary writes:
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1) pour désigner les 2 sommets d'un segment ?
Voir std::advance
le problème c'est que advance comme operator++ modifient l'itérateur alors que moi je voudrais obtenir son précédent sans modifier ipv1. La solution proposée par Falk Tannhäuser fait ce que je souhaite mais je n'arrive pas à être convaincu qu'il n'y a pas un tel mécanisme interne à la STL...
Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
Parce que la complexite ne serait pas en temps constant.
ce qui n'est pas bien grave, il suffit de le savoir. De toute façon advance ou n appels à ++ sont également effectués en O(n).
En tout cas merci de ta réponse, je ne connaissais pas advance.
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis
*(++ipv1) pour désigner les 2 sommets d'un segment ?
Voir std::advance
le problème c'est que advance comme operator++ modifient l'itérateur alors que
moi je voudrais obtenir son précédent sans modifier ipv1.
La solution proposée par Falk Tannhäuser fait ce que je souhaite mais je
n'arrive pas à être convaincu qu'il n'y a pas un tel mécanisme interne à la STL...
Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour
les Bidirectionnal iterators ?
Parce que la complexite ne serait pas en temps constant.
ce qui n'est pas bien grave, il suffit de le savoir. De toute façon advance ou n
appels à ++ sont également effectués en O(n).
En tout cas merci de ta réponse, je ne connaissais pas advance.
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1) pour désigner les 2 sommets d'un segment ?
Voir std::advance
le problème c'est que advance comme operator++ modifient l'itérateur alors que moi je voudrais obtenir son précédent sans modifier ipv1. La solution proposée par Falk Tannhäuser fait ce que je souhaite mais je n'arrive pas à être convaincu qu'il n'y a pas un tel mécanisme interne à la STL...
Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
Parce que la complexite ne serait pas en temps constant.
ce qui n'est pas bien grave, il suffit de le savoir. De toute façon advance ou n appels à ++ sont également effectués en O(n).
En tout cas merci de ta réponse, je ne connaissais pas advance.
-- Aurélien Barbier-Accary
Pierre Barbier de Reuille
Bonjour,
J'ai des polygones convexes définis par des listes et je cherche une intersection. Pour ça j'effectue le code suivant :
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1) pour désigner les 2 sommets d'un segment ? Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis
*(++ipv1) pour désigner les 2 sommets d'un segment ? Y'a-t-il une raison
pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal
iterators ?
Est-on vraiment obligé de passer par l'écriture (moche) *(--ipv1) puis *(++ipv1) pour désigner les 2 sommets d'un segment ? Y'a-t-il une raison pour laquelle il n'existe pas d'opérateur + pour les Bidirectionnal iterators ?