0

是否有可能在 BOOST_FOREACH 循环中使用带有 std::distance 的differ_type?

#define foreach_ BOOST_FOREACH
class iObj { /* some def and impl */ };
typedef set<iObj*> iSet;

int main() {
    iSet *iobjs = new iSet();

    // fill set with integers
    for( int i=0; i<100; i++) {
        iobjs->insert( new iObj(i+1+i*2) );
    }

    // output content of set
    cout << "print objects ASC" << endl;
    for( iSet::const_iterator oIt = iobjs->begin();
         oIt != iobjs->end(); ++oIt) {
        iSet::difference_type oIndex = std::distance( iobjs->begin(), oIt );
        if( oIndex < 50 ) {
            cout << " #" << oIndex << ": " << **oIt << endl;
        } else {
            break;
        }
    }

    // output with BOOST
    cout << "print objects ASC" << endl;
    foreach_( iObj *o, *iobjs ) {
        cout << *o << endl;
        // no access of index?
    }

    delete iobjs;
    return 0;
}

更方便地显示例如大集合的前 50 个条目,而不是全部内容,并且使用 std::distance 不需要插入新的计数器变量并由我自己增加它

4

1 回答 1

0

您想从循环体内了解循环迭代BOOST_FOREACH吗?不,你不能那样做。您也不能使用基于 C++11 范围的for循环来做到这一点。为此,for最好使用普通循环。(请,请,请停止使用BOOST_FOREACH。C++11 的基于范围for是该主题的最终决定。)

我还应该指出,您的代码不必要地低效。std::set的迭代器不是随机访问的,std::distanceO(N) 也是如此。更好的是保留一个单独的循环计数器,并在每次循环中简单地增加它。

此外,您的代码正在泄漏内存。尽管您正在删除std::set您已new编辑的对象,但您并没有删除您已编辑的所有iObj对象new。似乎不需要在您显示的代码中动态分配任何内容。尝试仅按值存储对象而不是new'ing 它们,并且也使用本地std::set堆栈变量。你会为自己省去一个麻烦的世界。

于 2013-08-22T00:20:47.950 回答