使用一个迭代器迭代向量的向量



假设我有一个

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;
}

我需要将sA以及从B传递到其他一些类X的所有SomeDataClass对象。我不想让班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_iterator结合起来,boost_iterator_range

使用 range-v3,您可以这样做

std::vector< std::vector< int > > v /* = ...*/;
for (auto e : v | ranges::view::join) {
std::cout << e << std::endl;
}

演示

最新更新