管道运算符在c ++ boost :: adapters :: filtered中的作用是什么?

时间:2018-04-04 19:03:04

标签: c++ boost

boost::adaptors::filtered中,过滤函数使用likeo:

std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;

boost::copy(
        input | filtered(is_even()),
        std::ostream_iterator<int>(std::cout, ","));

在这种情况下管道操作员的影响是什么?它没有为std::vector定义,是否超载?如果是这样,如何有效地在图书馆中搜索像boost这样的运算符?

1 个答案:

答案 0 :(得分:3)

这是Boost Range Adaptor。此online book "The Boost C++ Libraries"已编写了更多文档。

有许多这样的范围,可以编写高级功能效果。例子如下:

filtered适配器

input | filtered(is_even())创建适配器类型的临时实例:

boost::range_detail::filtered_range<is_even, std::vector<int> >

这是一个为Range Concept建模并保留对源范围(input)的引用以及过滤谓词(is_even())的副本的类型。

然后实现Range Concept,使得范围的迭代产生双向范围,就好像它只有源范围的元素满足过滤谓词一样。你可以同样写:

is_even predicate;
for (auto const& i : input)
    if (predicate(i))
        std::cout << i << ",";

range | adaptor是一个表达式模板,可生成新的自适应范围。

如何/为何与|一起使用?

真正的答案是“因为它是如何设计和记录的”。更具技术性的解释是因为filtered(is_even())属于boost::range_detail::filter_holder<is_even>类型,其重载operator |

template< class SinglePassRange, class Predicate >
inline filtered_range<Predicate, SinglePassRange>
operator|(SinglePassRange& r,
          const filter_holder<Predicate>& f)
{
    BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange>));
    return filtered_range<Predicate, SinglePassRange>( f.val, r );
}
  

注意:断言仅验证最小所需的遍历类别。如上所述,您将获得"The minimum of the range category of rng and Bidirectional Range",在这种情况下,这是一个双向范围(因为向量具有随机遍历)。

其他事

  

我已经迷失在输入+ = 1,2,.... - 用户463035818 56分钟之前

这是Boost Assign,与范围适配器无关,我冒昧地认为C ++ 11大部分已经过时了,因为你可以很容易地说

std::vector<int> input { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

或者确实

std::vector<int> input;
input.insert(input.end(), { 1, 2, 3, 4, 5, 6, 7, 8, 9 });