C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

question sur list<T>::iterator

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Aurélien Barbier-Accary
Guest





PostPosted: Thu May 04, 2006 11:21 am    Post subject: question sur list<T>::iterator Reply with quote



Bonjour,

J'ai des polygones convexes définis par des listes et je cherche une
intersection. Pour ça j'effectue le code suivant :

list<MPoint3D>::iterator ipv1;
list<MPoint3D>::reverse_iterator ipv2;
bool inter_polygons_exists = false;
MPoint3D inter_polygons;
for(ipv1=++poly1->begin(); (!inter_polygons_exists) && (ipv1!=poly1->end()); ipv1++)
for(ipv2=++poly2->rbegin(); (!inter_polygons_exists) &&
(ipv2!=poly2->rend()); ipv2++)
inter_polygons = intersectCoplanarSegments(*(--ipv1),*(++ipv1),
*(--ipv2),*(++ipv2), inter_polygons);

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 ?

Merci pour vos lumières.

--
Aurélien Barbier-Accary
Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Thu May 04, 2006 11:21 am    Post subject: Re: question sur list<T>::iterator Reply with quote



Il faut bien sûr lire :

Aurélien Barbier-Accary a écrit :
Quote:
[...]
inter_polygons_exists = intersectCoplanarSegments [...]
[...]

mais ça n'a rien à voir avec le "problème"...
Back to top
Falk Tannhäuser
Guest





PostPosted: Thu May 04, 2006 12:21 pm    Post subject: Re: question sur list<T>::iterator Reply with quote



Aurélien Barbier-Accary wrote:
Quote:
inter_polygons_exists = intersectCoplanarSegments(*(--ipv1), *(++ipv1),
*(--ipv2), *(++ipv2),
inter_polygons);

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 ?

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;
}

... intersectCoplanarSegments(*predecessor(ipv1), *ipv1,
*predecessor(ipv2), *ipv2,
inter_polygons);


Falk
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu May 04, 2006 1:21 pm    Post subject: Re: question sur list<T>::iterator Reply with quote

Aurélien Barbier-Accary <NOSPAM_barbier.aurelien (AT) free (DOT) fr.invalid> writes:

Quote:
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

Quote:
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
Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Thu May 04, 2006 2:21 pm    Post subject: Re: question sur list<T>::iterator Reply with quote

Jean-Marc Bourguet a écrit :
Quote:
Aurélien Barbier-Accary <NOSPAM_barbier.aurelien (AT) free (DOT) fr.invalid> 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...

Quote:
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
Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Thu May 04, 2006 2:21 pm    Post subject: Re: question sur list<T>::iterator Reply with quote

Falk Tannhäuser a écrit :
Quote:
template<typename Iter> inline Iter predecessor(Iter it)
{
return --it;
}

... intersectCoplanarSegments(*predecessor(ipv1), *ipv1,
*predecessor(ipv2), *ipv2,
inter_polygons);


Falk

Merci.
Je trouve étrange qu'une telle fonction n'existe pas de base dans la STL !?!!

--
Aurélien Barbier-Accary
Back to top
Pierre Barbier de Reuille
Guest





PostPosted: Sun May 14, 2006 1:22 pm    Post subject: Re: question sur list<T>::iterator Reply with quote

Aurélien Barbier-Accary a écrit :
Quote:
Bonjour,

J'ai des polygones convexes définis par des listes et je cherche une
intersection. Pour ça j'effectue le code suivant :

list<MPoint3D>::iterator ipv1;
list<MPoint3D>::reverse_iterator ipv2;
bool inter_polygons_exists = false;
MPoint3D inter_polygons;
for(ipv1=++poly1->begin(); (!inter_polygons_exists) &&
(ipv1!=poly1->end()); ipv1++)
for(ipv2=++poly2->rbegin(); (!inter_polygons_exists) &&
(ipv2!=poly2->rend()); ipv2++)
inter_polygons = intersectCoplanarSegments(*(--ipv1),*(++ipv1),
*(--ipv2),*(++ipv2), inter_polygons);

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 ?

Merci pour vos lumières.


Et pourquoi pas tout simplement :


list<MPoint3D>::iterator ipv11, ipv12 = poly1->begin();
list<MPoint3D>::reverse_iterator ipv21, ipv22 = poly2->rbegin();
MPoint3D inter_polygons;
bool inter_polygons_exists = false;
for( ipv11 = ipv12++ ; (!inter_polygons_exists) &&
(ipv12!=poly1->end()); ipv11++, ipv12++)
{
for(ipv21 = ipv22++; (!inter_polygons_exists) &&
(ipv22!=poly2->rend()); ipv21++, ipv22++)
{
inter_polygons_exists = intersectCoplanarSegments(*ipv11,*pv12,
*ipv21,*ipv22, inter_polygons);
}
}

Ce qui évite tous les problèmes d'ordre d'évaluation et fait ce que tu
veux ...

Pierre
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.