предварительный итератор в цикле

есть ли причина, почему это работает хорошо

vector<CalcToken*>* myVec; //assume this contains CalcToken
for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,1)) {
cout<< (*it)->toString()<< " ";
}

и это ничего мне не вернет?(Заранее (это, 2))

for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,2)) {
cout<< (*it)->toString()<< " ";
}

Я хочу сделать цикл, который должен перепрыгивать через некоторые элементы …, следующее не работает для меня либо это ++, это ++ и это + = 2.

2

Решение

Если вектор имеет нечетное количество элементов, advance call попытается продвинуть итератор за конец вектора. Это неопределенное поведение.

Один из способов исправить это — использовать следующую модификацию стандарта. advance (Я ограничиваю направление вперед, чтобы сохранить себя) [непроверенный код]:

template<typename Iterator>
void limited_advance(Iterator& it, Iterator end, unsigned distance,
std::random_access_iterator_tag)
{
if ((end - it) < distance)
it += distance;
else
it = end;
}

template<typename Iterator>
void limited_advance(Iterator& it, Iterator end, unsigned distance,
...)
{
while (it != end && distance > 0)
{
++it;
--distance;
}
}

template<typename Iterator>
void limited_advance(Iterator& it, Iterator end, unsigned distance)
{
limited_advance(it, end, distance,
typename std::iterator_traits<Iterator>::iterator_category());
}

а затем заменить advance(it,2) с limited_advance(it, myVec->end(), 2),

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]