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
課程知道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
相關:http://stackoverflow.com/q/981186/1025391 – moooeeeep
幾乎是一個重複:[Flattening iterator](http://stackoverflow.com/q/3623082/335858) – dasblinkenlight
[iterator for 2d vector](http://stackoverflow.com/questions/1784573/iterator-for-2d-vector) – datell