Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

std::advance

5 réponses
Avatar
Guillaume
Bonjour =E0 tous

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

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 =E9t=E9
impl=E9ment=E9es et que la r=E9solution des templates d=E9tecte que les
operateurs + et - sont pr=E9sents ou pas?

Merci pour vos =E9claircissements.

5 réponses

Avatar
ld
On 9 déc, 17:13, 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? 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?



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

a+, ld.
Avatar
Marc Duflot
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/
Avatar
James Kanze
On Dec 9, 4:35 pm, Marc Duflot 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
Avatar
Fabien LE LEZ
On Wed, 9 Dec 2009 08:13:07 -0800 (PST), Guillaume
:

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 "+".
Avatar
Alp Mestan
On Dec 9, 5:13 pm, Guillaume 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.