分区boost :: range ::转换范围适配器

时间:2015-10-01 13:33:27

标签: c++ boost boost-range

我正在尝试对-Xlint:unchecked适配器进行分区:

boost::range::transformed

编译器抱怨#include <boost/range.hpp> #include <boost/range/algorithm/partition.hpp> #include <boost/range/algorithm/transform.hpp> #include <boost/range/any_range.hpp> #include <boost/range/adaptor/transformed.hpp> using boost::adaptors::transformed; void foo() { boost::any_range<int, boost::forward_traversal_tag, int&, std::ptrdiff_t> r; auto t = r | transformed( [](int) {return 0;} ); auto p = boost::range::partition(t, [](int) {return true;} ); std::vector<int> v; auto t2 = r | transformed( [](int) {return 0;} ); auto p2 = boost::range::partition(t2, [](int) {return true;} ); } p1无法找到接受p2的函数__partition。完整的错误消息是

boost::iterators__transform_iterator

我很遗憾,没有看到解决方案。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

转化范围不是可变序列。

您无法对此范围进行分区(因为您无法交换元素)。

您可以查看partition_copy,在这种情况下,您应该有一个目标迭代器来接收分区范围。

通过一些工作,看起来你应该能够制作一个Boost Range风格的适配器(参见有关扩展的文档:http://www.boost.org/doc/libs/1_59_0/libs/range/doc/html/range/reference/extending/method_3.html),以防你真的坚持{{1}就像在第一个例子中一样。

样品

以下是我建议的“中途”解决方案:方便而不需要太多努力(c ++ 11)

<强> Live On Coliru

#include <boost/range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/algorithm_ext.hpp>
#include <boost/range/any_range.hpp>
#include <boost/range/adaptors.hpp>

using boost::adaptors::transformed;

namespace {
    // convenience wrapper
    template <typename Range, typename Predicate, typename OutIt1, typename OutIt2>
        std::pair<OutIt1, OutIt2> partition_copy(Range const& range, OutIt1 out1, OutIt2 out2, Predicate&& predicate) {
            return std::partition_copy(
                    boost::begin(range), boost::end(range),
                    out1, out2,
                    std::forward<Predicate>(predicate));
        }
}

#include <iostream>

int main()
{
    std::vector<int> demo { 1,2,7,3,-9,42 };

    std::vector<int> even, odd;
    partition_copy(
            demo | transformed( [](int i) {return i+1;} ), 
            back_inserter(even), back_inserter(odd),
            [] (int i) { return 0 == i%2; }
        );

    // output
    boost::copy(even, std::ostream_iterator<int>(std::cout << "even : ", " "));
    boost::copy(odd,  std::ostream_iterator<int>(std::cout << "\nodd  : ", " "));
}

打印

even : 2 8 4 -8 
odd  : 3 43