2011-05-11 9 views
5

Mam wektor, który I iteracji. Ostatnim elementem wektora jest przypadek specjalny i chciałbym go przetestować osobno. Na przykład, można zrobić coś takiego jak:Jak mogę przetestować ostatni element w wektorze podczas korzystania z BOOST_FOREACH?

for (iterator = vector.begin(); iterator != vector.end(); ++iterator) { 
    if ((iterator + 1) == (vector.end())) { 
     ... 
    } else { 
     ... 
    } 
} 

Chciałbym wymienić iterator z BOOST_FOREACH makro. Czy można wykonać podobny test dla końcowego elementu?

+1

Dlaczego ostatni jeden specjalny przypadek? Może być lepszy sposób. – GManNickG

+1

czy możesz użyć 'BOOST_REVERSE_FOREACH' i przetestować pierwszy? –

Odpowiedz

13
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 
} 
5

Od BOOST_FOREACH prac z zakresów można podzielić wektor w zakresie chcesz pracować normalnie (w pętli BOOST_FOREACH) i której chcesz traktować specjalnie:

#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: %d\n", *special_item); 

    return 0; 
}