OVH Cloud OVH Cloud

n1479 a propos de array::iterator

3 réponses
Avatar
Benoît Dejean
Bonjour, je me pose une question quand à l'utilisation de std::iterator dans
l'implémentation de la STL. Je pense qu'il est raisonnable que tous les
iterator de la STL soient des sous-classes de std::iterator. Ce qui me permet
d'écrire des choses comme :

template<typename Sequence>
void print_all(const Sequence& seq)
{
typedef typename Sequence::const_iterator InputIterator;
typedef typename InputIterator::value_type ValueType;
typedef typename std::ostream_iterator<ValueType> OutputIterator;

std::copy(seq.begin(), seq.end(), OutputIterator(std::cout, ", "));
std::cout << '\n';
}

et d'utiliser cela avec std::vector, std::set, ...

Maintenant, je lis
A Proposal to Add a Fixed Size Array Wrapper to the Standard Library
Technical Report
http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2003/n1479.html

et en gras

typedef implementation defined iterator;
// See lib.container.requirements
typedef implementation defined const_iterator;


et évidemment le lien "See lib.container.requirements" en commentaire ne
fonctionne pas, ce qui me fait me poser des questions.

Ce qui m'inquiète, c'est l'implémentation que fournit gcc-4.0
libstdc++-v3/include/tr1/array


typedef value_type* iterator;
typedef const value_type* const_iterator;

avec une telle définition, mon code ne fonctionne plus. Je sais que gcc
fournit une implémentation expérimental, mais serait-elle légale ? Si oui,
pourquoi est-elle permise puisqu'apparemment elle rendrait std:array
incompatible avec ses les autres conteneurs de la STL ?

merci.

3 réponses

Avatar
Gabriel Dos Reis
Benoît Dejean writes:

| Bonjour, je me pose une question quand à l'utilisation de std::iterator dans
| l'implémentation de la STL. Je pense qu'il est raisonnable que tous les
| iterator de la STL soient des sous-classes de std::iterator. Ce qui me permet
| d'écrire des choses comme :

C'est une hypothèse raisonnable, mais en pratique non-universellement
vérifiée.

| template<typename Sequence>
| void print_all(const Sequence& seq)
| {
| typedef typename Sequence::const_iterator InputIterator;
| typedef typename InputIterator::value_type ValueType;

Rien n'interdit à std::vector<T>::iterator d'être un T*.
Utilise std::iterator_traits<>.

-- Gaby
Avatar
Benoît Dejean
Le Sun, 24 Apr 2005 07:31:49 -0500, Gabriel Dos Reis a écrit :

Benoît Dejean writes:

Rien n'interdit à std::vector<T>::iterator d'être un T*.
Utilise std::iterator_traits<>.


Merci, est-ce que je peux en conclure que je dois utiliser
std::iterator_traits<> systématiquement ?

Avatar
Gabriel Dos Reis
Benoît Dejean writes:

| Le Sun, 24 Apr 2005 07:31:49 -0500, Gabriel Dos Reis a écrit :
|
| > Benoît Dejean writes:
|
| > Rien n'interdit à std::vector<T>::iterator d'être un T*.
| > Utilise std::iterator_traits<>.
|
| Merci, est-ce que je peux en conclure que je dois utiliser
| std::iterator_traits<> systématiquement ?

Pour ce gence de choses, il est plus fiable que la notation
i::value_type.

-- Gaby