我正在尝试对-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
我很遗憾,没有看到解决方案。任何帮助将不胜感激。
答案 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