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

wel*_*dea 5 c++ boost

boost::adaptors::filteredfilter函数中的用法如下:

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, ","));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,管道操作员会产生什么影响?它没有为定义std::vector,它是过载吗?如果是这样,一个人如何有效地寻找诸如boost之类的自由经营者?

seh*_*ehe 4

这是一个升压范围适配器在线书籍“The Boost C++ Libraries”中编写了更多文档。

\n\n

这样的范围有很多,可以组合起来写出高级的函数效果。示例如下:

\n\n\n\n

适配器filtered

\n\n

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

\n\n
boost::range_detail::filtered_range<is_even, std::vector<int> >\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一种对范围概念进行建模的类型,并保存对源范围 ( input) 的引用以及过滤谓词 ( is_even()) 的副本。

\n\n

然后实现范围概念,以便范围的迭代产生双向范围,就好像它仅具有满足过滤谓词的源范围的元素一样。你同样可以写:

\n\n
is_even predicate;\nfor (auto const& i : input)\n    if (predicate(i))\n        std::cout << i << ",";\n
Run Code Online (Sandbox Code Playgroud)\n\n

range | adaptor是生成新的适应范围的表达式模板。

\n\n

它如何/为什么起作用|

\n\n

真正的答案是“因为这就是它的设计和记录方式”。更技术性的解释是因为filtered(is_even())is 的类型boost::range_detail::filter_holder<is_even>具有重载operator |

\n\n
template< class SinglePassRange, class Predicate >\ninline filtered_range<Predicate, SinglePassRange>\noperator|(SinglePassRange& r,\n          const filter_holder<Predicate>& f)\n{\n    BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange>));\n    return filtered_range<Predicate, SinglePassRange>( f.val, r );\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

注意:断言仅验证所需的最低遍历类别。如文档所述,您将得到“rng 和双向范围的范围类别的最小值”,在本例中是双向范围(因为向量具有随机遍历)。

\n
\n\n

另一件事

\n\n
\n

我已经迷失在输入 += 1,2,.... \xe2\x80\x93 user463035818 56 分钟前

\n
\n\n

这就是 Boost 分配,与范围适配器无关,我敢说 C++11 让它基本上过时了,因为你可以很容易地说

\n\n
std::vector<int> input { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者确实

\n\n
std::vector<int> input;\ninput.insert(input.end(), { 1, 2, 3, 4, 5, 6, 7, 8, 9 });\n
Run Code Online (Sandbox Code Playgroud)\n