2017-04-04 41 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