簡體   English   中英

使用一個迭代器迭代向量向量

[英]Iterate over vector of vectors with one iterator

假設我有一個

std::vector< std::vector< int > > vvi;

我想隱藏vvi是向量向量的事實,並在其所有包含的int元素上創建一個迭代器,如:

class vvi_iterator; // Iterator over std::vector< std::vector< int > >
                    // I am looking for a template of such class, 
                    // or I would need to implement it on my own.

vvi_iterator itBegin = make_vvi_iterator_begin( vvi );  // helper function
                                // that creates a vvi_iterator pointing to the 
                                // first element of the first vector

vvi_iterator itEnd   = make_vvi_iterator_end( vvi ); // helper function
                                // that creates a vvi_iterator in the "end" state
                                // (e.g. pointing behind the last element of the 
                                // last vector)


// This is how I'm going to use it:

auto itRange = boost::iterator_range<vvi_iterator>( itBegin, itEnd );

for( int& i : itRange ) {
   doSomething(i);
}

我不需要插入/擦除int元素。

我可以使用boost ,以及其他外部庫。

我可以使用C++11 ,但不能使用c++14 然而,涉及c++14解決方案也很有趣。

提前致謝。

UPD。:折疊圈對我不起作用。 在我的實際用例中

class A {
private:
    std::array< std::unordered_map< std::unique_ptr< SomeDataClass > > > _own_data;
}

class B {
private:
    std::vector< std::reference_wrapper< SomeDataClass > > _referenced_data;
}

我需要將引用s傳遞給A所有SomeDataClass對象,以及從B到其他類X 我不希望X類知道AB的內部結構,我不想單獨處理它們。

如果我沒有折疊容器,我可以使用boost::indirect_iterator

class A {
private:
    std::array< std::unique_ptr< SomeDataClass > > _own_data;

public:
    boost::iterator_range< 
        boost::indirect_iterator<
            std::array< std::unique_ptr< SomeDataClass> >::iterator > >
    getSomeData() {
        return { boost::make_indirect_iterator( _own_data.begin() ),
                 boost::make_indirect_iterator( _own_data.end()   ) }
    }
}

class X {
private:
    doSomething( SomeDataClass& someData );

public:
    template<typename IteratorRangeType>
    processSomeData( IteratorRangeType itRange ) {
        for( auto& someData : itRange ) {
            doSomething( someData ); 
        }
    }
}



int main(int, char**) {
    A a;
    X x;
    x.processsSomeData( a.getSomeData() ); // isn't it beautiful? 
}

現在,我希望有一些像folded_container_iterator ,我希望我可以將它與boost::indirect_iteratorboost_iterator_range結合起來

使用range-v3 ,您可以這樣做

std::vector< std::vector< int > > v /* = ...*/;

for (auto e : v | ranges::view::join) {
    std::cout << e << std::endl;
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM