#c #boost #boost-foreach
#c #повышение #boost-foreach
Вопрос:
У меня есть вектор, который я повторяю. Последний элемент вектора является частным случаем, и я хотел бы протестировать его отдельно. Например, я могу сделать что-то подобное:
for (iterator = vector.begin(); iterator != vector.end(); iterator) {
if ((iterator 1) == (vector.end())) {
...
} else {
...
}
}
Я хотел бы заменить итератор на BOOST_FOREACH
макрос. Можно ли выполнить аналогичный тест для конечного элемента?
Комментарии:
1. Почему последний является особым случаем? Может быть лучший способ.
2. не могли бы вы использовать
BOOST_REVERSE_FOREACH
и протестировать для первого?
Ответ №1:
if(!vec.empty())
{
BOOST_FOREACH(int e, boost::make_iterator_range(vec.begin(), vec.end()-1))
{
// Handle each element but the last
}
// Handle last element here
}
Ответ №2:
Поскольку BOOST_FOREACH
работает с диапазонами, вы можете разделить свой вектор на диапазон, с которым вы хотите работать обычно (в BOOST_FOREACH
цикле) и который вы хотите обработать специально:
#include <stdio.h>
#include <vector>
#include "boost/foreach.hpp"
#include "boost/range.hpp"
using namespace std;
int main () {
vector<int> foo;
foo.push_back(1);
foo.push_back(2);
foo.push_back(3);
foo.push_back(4);
vector<int>::iterator special_item(foo.end() - 1);
boost::sub_range< vector<int> > normal_items(foo.begin(), special_item);
BOOST_FOREACH( int i, normal_items) {
printf( "%d ", i);
}
printf( "nspecial item: %dn", *special_item);
return 0;
}