[英]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
類知道A
和B
的內部結構,我不想單獨處理它們。
如果我沒有折疊容器,我可以使用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
結合起來
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.