Использование итератора STL без его инициализации - PullRequest
2 голосов
/ 22 января 2009

Я хотел бы сделать что-то вроде этого:

container::iterator it = NULL;

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

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


}

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

Но я не могу создать и инициализировать итератор в NULL. Есть ли способ, которым я могу это сделать? В идеале я бы просто создал и назначил итератор в коммутаторе, но тогда он сразу бы вышел из области видимости.

Ответы [ 4 ]

11 голосов
/ 22 января 2009

Вам просто не нужно его инициализировать вообще, потому что итераторы DefaultConstructible.

6 голосов
/ 22 января 2009

Все, что вам нужно сделать, это изменить

container::iterator it = NULL;

до

container::iterator it;

и я думаю, что ваш код будет работать так, как задумано.

3 голосов
/ 22 января 2009

Вам действительно нужен диапазон, а не просто начать итератор. Обратите внимание, что вы не можете сравнивать итераторы из разных контейнеров, поэтому лучше выбирать диапазон, а не итератор. Вы можете использовать Boost.Range для достижения этого:

#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 )
{
    ...
}
1 голос
/ 22 января 2009

Поскольку цикл проверяет завершение, вы должны сконструировать его таким образом, чтобы определить значения itEnd.

...