Bonjour,

Je vais faire simple par l'exemple. Voici la fonction find de la stl:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template<class InputIterator, class T>
  InputIterator find ( InputIterator first, InputIterator last, const T& value )
  {
    for ( ;first!=last; first++) if ( *first==value ) break;
    return first;
  }
find est une fonction qui consulte, elle ne modifie rien. Il est donc logique d'utiliser des const_iterator avec:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
std::vector<int> v(4,0);
std::vector<int>::const_iterator begin = v.begin();
std::vector<int>::const_iterator end = v.end();
std::vector<int>::const_iterator it = std::find(v.begin(),v.end(),0);
Après cette opération en "lecture seule", je ne pourrai jamais utiliser le résultat (mon iterator it) pour modifier v. Vous me direz d'utiliser des iterator à la place des const_iterator dans la fonction find. Très bien, mais il y a 2 problèmes:
- Il n'y a aucun sens à utiliser des iterators non constants dans une fonction qui ne modifie rien.
- Au final on n'utilise plus le const_iterator nul part.

L'exemple est volontairement très simple. Mais prenons l'exemple d'un conteneur fait maison il est indispensable de fournir 2 versions pour chaque méthode consultative:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
struct Famille {
 
    struct iterator { [...]
    };
    struct const_iterator { [...]
    };
 
    const_iterator trouverFrere(const_iterator membre) const;
    iterator trouverFrere(iterator membre);
 
};
La méthode trouverFrere(iterator membre) préserve l'état de la structure mais n'est pas constante. Bien sur l'état pourra être changé par l'intermédiaire de l'iterator retourné, mais la fonction elle même ne modifie rien. Elle devrait donc être const.

Je pose cette question parce que tous les conteneurs de mon programme sont voué à être modifié à un moment ou à un autre. Donc à aucun moment je ne peut utiliser de fonctions constantes sous peine de ne plus pouvoir modifier le conteneur. Ca rend le concept de const beau mais inutilisable.

Un problème de conception? Peut être, mais alors quelles sont les solutions?