加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 迭代一系列范围

发布时间:2020-12-16 07:34:05 所属栏目:百科 来源:网络整理
导读:参见英文答案 Flattening iterator????????????????????????????????????4个 如果我有一系列范围,有没有办法将它们连接在一起并迭代它们就好像它们是一个范围一样? 按范围,我指的是任何类型的容器或迭代器对.基本上就像boost的ranges.Boost已经有了一个函数
参见英文答案 > Flattening iterator????????????????????????????????????4个
如果我有一系列范围,有没有办法将它们连接在一起并迭代它们就好像它们是一个范围一样?

按范围,我指的是任何类型的容器或迭代器对.基本上就像boost的ranges.Boost已经有了一个函数来连接两个范围和boost :: join,但是这个函数不能加入任意数量的范围.

基本上,我正在寻找一种方法来执行许多函数在这段代码中所做的事情:

std::vector<std::vector<int>> n = {{0,1},{2,3}};
for (auto i : many(n))
    std::cout << i << 'n';

哪个会输出0,1,2,3.

在C#中,我有SelectMany可以做到这一点.

解决方法

下面是一个使用基于范围的展平迭代器的示例(取自 here并添加了boost :: make_iterator_range以显示范围版本)(但仍需要工作):

#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/range.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
#include <utility>

template <typename Iter>
class flattening_iterator :
    public boost::iterator_adaptor<
                flattening_iterator<Iter>,Iter,typename Iter::value_type::iterator::value_type,boost::forward_traversal_tag,typename Iter::value_type::iterator::value_type
    >
{
private:
        using super_t = boost::iterator_adaptor<
                                flattening_iterator<Iter>,typename Iter::value_type::iterator::value_type
                        >;
        using inner_iterator = typename Iter::value_type::iterator;
public:
        flattening_iterator(Iter it)
                : super_t(it),inner_begin(),inner_end(),outer_end(it)
        {}
        flattening_iterator(Iter begin,Iter end)
                : super_t(begin),inner_begin((*begin).begin()),inner_end((*begin).end()),outer_end(end)
        {}
    using value_type = typename Iter::value_type::iterator::value_type;
private:
    friend class boost::iterator_core_access;
    inner_iterator inner_begin;
    inner_iterator inner_end;
    Iter outer_end;

    void increment()
    {
        if (this->base_reference() == outer_end)
            return; // At the end

        ++inner_begin;
        if (inner_begin == inner_end)
        {
            ++this->base_reference();
            inner_begin = (*this->base_reference()).begin();
            inner_end = (*this->base_reference()).end();
        }
    }

    value_type dereference() const
    {
        return *inner_begin;
    }
};

template <typename Iter>
auto flat_iter(Iter it) -> flattening_iterator<Iter>
{
    return flattening_iterator<Iter>(it);
}

template <typename Iter>
auto flat_iter(Iter begin,Iter end) -> flattening_iterator<Iter>
{
    return flattening_iterator<Iter>(begin,end);
}

template <typename Cont>
auto flatten(Cont& c) -> boost::iterator_range<flattening_iterator<decltype(std::declval<Cont>().begin())>>
{
    return boost::make_iterator_range(flat_iter(c.begin(),c.end()),flat_iter(c.end()));
}


int main()
{
    std::vector<std::vector<int>> v1{{1,3},{4,5,6},{7,8,9}};
    for (auto i : flatten(v1))
    {
        std::cout << i << ' ';
    }
}

产量

1 2 3 4 5 6 7 8 9

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读