Как я могу проверить наличие последнего элемента в векторе при использовании BOOST_FOREACH?

#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;
}