C ++ iterator_adapter超过载体集合 [英] C++ iterator_adapter over collection of vectors

查看:168
本文介绍了C ++ iterator_adapter超过载体集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能重复:结果
  压扁迭代器

我有一些类型的向量的向量(例如INT)。我想迭代
在以上的载体,pretty元素集合很像迭代
在整数的向量。

I have a vector of vectors of some type (say int). I would like to iterate over the collection of elements in the vectors, pretty much like iterating over a vector of ints.

我可以实现的东西,做到这一点,但不知道如何使用升压转换器的
iterator_adapter做到这一点。

I can implement something that does this but was wondering how to use boost's iterator_adapter to do this.

推荐答案

下面是我砍死了。它的工作原理,并输出正确的结果,但有很多工作要做。

Here is something I hacked up. It works and outputs the correct result, but has a lot of work to be done.

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

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>,
                                Iter,
                                typename Iter::value_type::iterator::value_type,
                                boost::forward_traversal_tag,
                                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 flatten(Iter it) -> flattening_iterator<Iter>
{
    return flattening_iterator<Iter>(it);
}

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

int main()
{
    std::vector<std::vector<int>> v1{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    for (auto i = flatten(v1.begin(), v1.end()); i != flatten(v1.end()); ++i)
    {
        std::cout << *i << ' ';
    }
    std::cout << std::endl;
    std::vector<std::vector<std::string>> v2{{"Hello", "Print"}, {"Me", "Here"}};
    std::copy(flatten(v2.begin(), v2.end()), flatten(v2.end()),
                  std::ostream_iterator<std::string>(std::cout, " "));
}

这篇关于C ++ iterator_adapter超过载体集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆