Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

std::advance

0 views
Skip to first unread message

Guillaume

unread,
Dec 9, 2009, 11:13:07 AM12/9/09
to
Bonjour à tous

je suis intrigué par la fonction std::advance. Je lis dans la doc que
cette fonction utilise les opérateur + et - dans le cas d'un
RandomIterator, et les operateurs ++ et -- sinon. Ma question est
donc, quand j'écris :

std::vector::iterator it;
std::advance( it, 5 );

comment la fonction std::advance pour savoir si 'it' est un
RandomIterator ou pas? Est-ce que deux versions de la fonction ont été
implémentées et que la résolution des templates détecte que les
operateurs + et - sont présents ou pas?

Merci pour vos éclaircissements.

ld

unread,
Dec 9, 2009, 11:30:27 AM12/9/09
to

la specialisation template se fait sur le type (au sens large), donc
pas sur + et - mais sur RandomIterator ou non.

a+, ld.

Marc Duflot

unread,
Dec 9, 2009, 11:35:04 AM12/9/09
to
Guillaume wrote:
> Bonjour � tous
>
> je suis intrigu� par la fonction std::advance. Je lis dans la doc que
> cette fonction utilise les op�rateur + et - dans le cas d'un

> RandomIterator, et les operateurs ++ et -- sinon. Ma question est
> donc, quand j'�cris :

>
> std::vector::iterator it;
> std::advance( it, 5 );
>
> comment la fonction std::advance pour savoir si 'it' est un
> RandomIterator ou pas?

Gr�ce aux iterator_traits.

Si tu �cris ton propre it�rateur, tu peux en b�n�ficier en d�rivant de
random_iterator_tag.

--
Dr Marc Duflot -- CENAERO
B�timent �OLE, 1er �tage
Rue des Fr�res Wright, 29
B-6041 Gosselies, Belgium

Tel. : +32 (0)71 91.93.64
Fax. : +32 (0)71 91.93.31

http://research.cenaero.be/people/duflot/

James Kanze

unread,
Dec 9, 2009, 12:48:37 PM12/9/09
to
On Dec 9, 4:35 pm, Marc Duflot <marc.duf...@gmail.com> wrote:
> Guillaume wrote:

> > je suis intrigu par la fonction std::advance. Je lis dans la
> > doc que cette fonction utilise les op rateur + et - dans le
> > cas d'un RandomIterator, et les operateurs ++ et -- sinon.
> > Ma question est donc, quand j' cris :

> > std::vector::iterator it;
> > std::advance( it, 5 );

> > comment la fonction std::advance pour savoir si 'it' est un
> > RandomIterator ou pas?

> Grâce aux iterator_traits.

> Si tu écris ton propre itérateur, tu peux en bénéficier en
> dérivant de random_iterator_tag.

Non en dérivant ; en y ajoutant des typedef voulu :
typedef ptrdiff_t difference_type;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef std::random_iterator_tag iterator_category;
Ou en dérivant de std::iterator (un template auquel il faut
fournir au moins les deux premiers paramètres : la catégorie
(std::random_iterator_tag, etc.) et le type de valeur.

Sinon, c'est aussi possible de définir ton propre spécialisation
de std::iterator_traits.

--
James Kanze

Fabien LE LEZ

unread,
Dec 9, 2009, 1:21:26 PM12/9/09
to
On Wed, 9 Dec 2009 08:13:07 -0800 (PST), Guillaume
<g.go...@gmail.com>:

>std::vector::iterator it;
>std::advance( it, 5 );
>
>comment la fonction std::advance

La fonction std::advance n'existe pas. Il s'agit d'une fonction
template.
Quand tu �cris

std::advance( it, 5 );

le compilateur d�tecte que "it" a pour type "std::vector::iterator",
et convertit donc la ligne en :
std::advance <std::vector::iterator> ( it, 5 );

Il en profite pour cr�er cette fonction
"std::advance<std::vector::iterator>" � partir du template.
Cette fonction pr�cise ne se pr�occupe que du type
std::vector::iterator, donc utilise syst�matiquement l'op�rateur "+".

Alp Mestan

unread,
Dec 16, 2009, 7:33:19 PM12/16/09
to
On Dec 9, 5:13 pm, Guillaume <g.gour...@gmail.com> wrote:
> comment la fonction std::advance pour savoir si 'it' est un
> RandomIterator ou pas? Est-ce que deux versions de la fonction ont été
> implémentées et que la résolution des templates détecte que les
> operateurs + et - sont présents ou pas?

En plus des réponses données ci-dessus, je te conseille de faire une
recherche sur le principe de "tag dispatching". *advance* est
justement l'exemple classique qui accompagne une explication du
principe de tag dispatching.

0 new messages