c++11 foreach de la syntaxe et de la coutume itérateur
Je suis en train d'écrire un itérateur pour un conteneur qui est utilisé à la place d'un conteneur STL. Actuellement, le conteneur STL est utilisé dans de nombreux endroits avec le c++11 syntaxe foreach par exemple: for(auto &x: C)
. Nous avons besoin de mettre à jour le code pour utiliser une classe personnalisée qui enveloppe le conteneur STL:
template< typename Type>
class SomeSortedContainer{
std::vector<typename Type> m_data; //we wish to iterate over this
//container implementation code
};
class SomeSortedContainerIterator{
//iterator code
};
Comment puis-je obtenir de l'auto pour utiliser la bonne itérateur pour le conteneur personnalisé de sorte que le code peut être appelé de la manière suivante?:
SomeSortedContainer C;
for(auto &x : C){
//do something with x...
}
En général ce qui est nécessaire pour s'assurer que les auto utilise le bon itérateur pour une classe?
- Si vous utilisez Visual Studio, vous pouvez passer la souris sur la variable du nom de son type. Autant que je me souvienne, il montre le type réel, pas
auto
.
Vous devez vous connecter pour publier un commentaire.
Vous avez deux choix:
begin
etend
qui peut être appelée commeC.begin()
etC.end()
;begin
etend
qui peuvent être trouvés en utilisant l'argument-dépendante de recherche, ou dans l'espace de nomsstd
, et peut être appelée commebegin(C)
etend(C)
.Pour être en mesure d'utiliser la gamme de base, votre classe doit fournir
const_iterator begin() const
etconst_iterator end() const
membres. Vous pouvez aussi surcharger le mondialbegin
fonction, mais ayant une fonction membre est mieux à mon avis.iterator begin()
etconst_iterator cbegin() const
est également recommandé, mais pas obligatoire. Si vous souhaitez simplement effectuer une itération sur un seul conteneur interne, c'est VRAIMENT facile:Si vous souhaitez effectuer une itération sur quelque chose de personnalisé, vous aurez probablement à la conception de votre propre itérateurs que les classes à l'intérieur de votre conteneur.
Pour plus de détails sur la rédaction d'un itérateur de classe, voir ma réponse ici.
Comme d'autres l'ont dit, votre conteneur doit mettre en œuvre
begin()
etend()
fonctions (ou le monde oustd::
des fonctions qui prennent des instances de votre conteneur en tant que paramètres).Ces fonctions doivent retourner le même type (généralement
container::iterator
, mais ce n'est qu'une convention). Le type retourné doit mettre en œuvreoperator*
,operator++
, etoperator!=
.À ma connaissance
SomeSortedContainer
juste besoin de fournirbegin()
etend()
. Et ces doit retourner un standard conforme de l'avant itérateur, dans votre casSomeSortedContainerIterator
, qui seraient en fait d'envelopper unestd::vector<Type>::iterator
. Avec compatible avec le standard je veux dire qu'il doit fournir l'habitude d'incrémentation et de déréférencement des opérateurs, mais aussi de tous ceuxvalue_type
,reference_type
, ... typedefs, qui sont utilisées par la construction foreach pour déterminer le type sous-jacent du conteneur éléments. Mais vous pourriez juste à l'avant de lastd::vector<Type>::iterator
.begin
etend
fonctions de membre puis le foreach pouvez également utiliser lebegin
etend
non-membre de fonctions.