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

3
假设我有一个

元素


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 的解决方案也很有趣。
提前感谢。


更新:折叠循环对我不起作用。在我的实际用例中,我有
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;
}

我需要将来自 AB 的所有 SomeDataClass 对象的引用传递给其他类 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
相关:https://dev59.com/dXNA5IYBdhLWcg3wZ81R - moooeeeep
1
几乎是一个重复的问题: 迭代器展平 - Sergey Kalinichenko
可能是iterator for 2d vector的重复问题。 - dtell
如果内部“向量”中的元素数量对于所有向量都相同,则我更喜欢使用单个基础“向量”的2D适配器来保存所有数据。然后,您仍然可以在基础“向量”上使用单个迭代器,但也可以通过2D适配器访问数据。此外,内存管理大大简化(仅调用一次“new int []”)。 - Walter
1个回答

2
使用range-v3,可以进行以下操作:
std::vector< std::vector< int > > v /* = ...*/;

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

Demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接