मेरे पास एक वेक्टर है जिसे मैं फिर से चालू करता हूं। वेक्टर का अंतिम तत्व विशेष मामला है, और मैं इसके लिए अलग से परीक्षण करना चाहता हूं। उदाहरण के लिए, मैं कुछ ऐसा कर सकता हूं:

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

मैं इटरेटर को BOOST_FOREACH मैक्रो से बदलना चाहता हूं। क्या अंतिम तत्व के लिए भी ऐसा ही परीक्षण किया जा सकता है?

5
v8891 11 मई 2011, 10:05
1
आखिरी एक विशेष मामला क्यों है? कोई बेहतर तरीका हो सकता है।
 – 
GManNickG
11 मई 2011, 10:20
1
क्या आप BOOST_REVERSE_FOREACH का उपयोग कर सकते हैं और पहले के लिए परीक्षण कर सकते हैं?
 – 
Matthieu M.
11 मई 2011, 12:43

2 जवाब

सबसे बढ़िया उत्तर
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
}
13
Yakov Galka 11 मई 2011, 10:25

चूंकि 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;
}
5
Michael Burr 11 मई 2011, 10:45