【问题标题】:Iterate over vector of vectors with one iterator用一个迭代器迭代向量的向量
【发布时间】:2017-08-29 11:14:52
【问题描述】:

假设我有一个

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 结合起来

【问题讨论】:

  • 几乎重复:Flattening iterator
  • iterator for 2d vector的可能重复
  • 如果内部vectors 中的元素数量对所有元素都相同,我更愿意使用单个底层vector 的二维适配来保存所有数据。然后,您仍然可以在底层 vector 上使用单个迭代器,但也可以通过 2D 适配器访问数据。此外,内存管理大大简化(只需调用一次new int[])。

标签: c++ iterator containers


【解决方案1】:

range-v3,你可以这样做

std::vector< std::vector< int > > v /* = ...*/;

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

Demo

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多