2017-04-04 40 views
1

假設我有一個遍歷向量的向量與一個迭代

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:摺疊環不適合我。在我的實際使用情況下,我有

​​

,我需要從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

+1

相關:http://stackoverflow.com/q/981186/1025391 – moooeeeep

+1

幾乎是一個重複:[Flattening iterator](http://stackoverflow.com/q/3623082/335858) – dasblinkenlight

+0

[iterator for 2d vector](http://stackoverflow.com/questions/1784573/iterator-for-2d-vector) – datell

回答

2
結合起來

隨着range-v3,你可以做

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

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

Demo