есть ли причина, почему это работает хорошо
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.
Если вектор имеет нечетное количество элементов, 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)
,
Других решений пока нет …