在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这样的运算符?
答案 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 });