2009-01-22 8 views
2

Je voudrais faire quelque chose comme ceci:STL Iterator sans initialisant il

container::iterator it = NULL; 

switch (eSomeEnum) 
{ 
case Container1: 
it = vecContainer1.begin(); 
break; 

case Container2: 
it = vecContainer2.begin(); 
break; 
... 


} 

for(; it != itEnd ; ++it) 
{ 
.. 
} 

Mais je ne peux pas créer et initialiser un itérateur à NULL. Y a-t-il un moyen de le faire? Idéalement, je voudrais juste créer et assigner l'itérateur dans le commutateur, mais alors il serait hors de portée immédiatement.

Répondre

11

Vous n'avez pas besoin de l'initialiser du tout, car les itérateurs sont DefaultConstructible.

6

Tout ce que vous avez besoin de faire est de changer

container::iterator it = NULL; 

à

container::iterator it; 

et je pense que votre code fonctionnera comme prévu.

+0

L'OP a déclaré qu'il ne peut pas le faire, g ++ et ++ clang ne pas accepter une comparaison nulle ou une initialisation nulle. Donc, AFAIK c'est une réponse sans signification, vous ne devriez pas poster des choses que vous «pensez» à propos de quand il s'avère que cela nuit à la communauté en général. –

+2

Cette réponse est essentiellement la même que celle qui a été acceptée. Comment est-ce mal? Je suis heureux de corriger les erreurs. –

1

Comme les tests de boucle pour la fin, vous devez le construire pour évaluer quelles valeurs itEnd.

3

Vous avez réellement besoin d'une plage, et pas seulement de commencer l'itérateur. Notez que vous ne pouvez pas comparer les itérateurs de différents conteneurs, il vaut donc mieux sélectionner la plage, pas l'itérateur. Vous pouvez utiliser Boost.Range pour y parvenir:

#include <boost/range.hpp> 
#include <boost/foreach.hpp> 

boost::iterator_range<container::iterator> r; 
switch(e) 
{ 
    case Container1: 
     r = boost::make_iterator_range(vecContainer1); 
    break; 

    case Container2: 
     r = boost::make_iterator_range(vecContainer2); 
    break; 

    ... 
} 

BOOST_FOREACH(container::value_type value, r) 
{ 
    ... 
}