Как сделать следующее более стильным/коротким способом?Как определить первый или последний элемент, итерирующий контейнер?
for(i=container.begin(); i!=container.end(); ++i) {
if (i!=container.begin()) {
cout << ", ";
}
cout << *i;
j=i;
if (++j==container.end()) {
cout << "!" << endl;
}
}
Такие решения, как foreach являются приемлемыми (действия по первому и последние элементы должны быть настраиваемыми, хотя).
P.S. Существует много ответов, которые обрабатывают первый элемент, но не последний. Вот что я имею в виду обработка последнего элемента:
for(i=container.begin(); i!=container.end(); ++i) {
j=i;
if (i==container.begin()) {
cout << "[" << *i << "]" << endl;
} else if (++j==container.end()) {
cout << ", (" << *i << ")" << "!" << endl;
} else {
cout << ", " << *i;
}
}
Не кажется ли вам, что это очень легко обрабатывать первый элемент вне тела цикла? Реальная проблема - последняя! Мне жаль, что я не смог прояснить важный вопрос, задающий вопрос. Я думаю, что в конце концов я получу окончательный ответ.
Я не думаю, что ваш пример верен. container.end() - это элемент после последнего.В конце вашего forloop (для последнего элемента) он увеличивается и становится container.end(), который является вашим конечным условием. Правильно: 'i + 1 == container.end()'. – Thirler
Поддерживается ли операция 'iterator + int 'для итераторов без случайного доступа? –
Thirler вы прокомментировали вариант ++ j или предыдущий? Я внес некоторые изменения после сообщения об ошибке Neil. – Basilevs