5

私は繰り返し処理するベクトルを持っています。ベクトルの最後の要素は特殊なケースであり、個別にテストしたいと思います。たとえば、私はそのようなことをするかもしれません:

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

BOOST_FOREACHイテレータをマクロに置き換えたいと思います。最終要素に対して同様のテストを行うことはできますか?

4

2 に答える 2

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
}
于 2011-05-11T06:25:49.833 に答える
5

範囲で動作するため、ベクトルを通常(ループ内で)動作させたい範囲と特別に扱いたい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: %d\n", *special_item);

    return 0;
}
于 2011-05-11T06:45:12.033 に答える