在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之类的自由经营者?
这是一个升压范围适配器。在线书籍“The Boost C++ Libraries”中编写了更多文档。
\n\n这样的范围有很多,可以组合起来写出高级的函数效果。示例如下:
\n\n\n\nfilteredinput | filtered(is_even())创建适配器类型的临时实例:
boost::range_detail::filtered_range<is_even, std::vector<int> >\nRun Code Online (Sandbox Code Playgroud)\n\n这是一种对范围概念进行建模的类型,并保存对源范围 ( input) 的引用以及过滤谓词 ( is_even()) 的副本。
然后实现范围概念,以便范围的迭代产生双向范围,就好像它仅具有满足过滤谓词的源范围的元素一样。你同样可以写:
\n\nis_even predicate;\nfor (auto const& i : input)\n if (predicate(i))\n std::cout << i << ",";\nRun Code Online (Sandbox Code Playgroud)\n\nrange | adaptor是生成新的适应范围的表达式模板。
|?真正的答案是“因为这就是它的设计和记录方式”。更技术性的解释是因为filtered(is_even())is 的类型boost::range_detail::filter_holder<is_even>具有重载operator |:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n注意:断言仅验证所需的最低遍历类别。如文档所述,您将得到“rng 和双向范围的范围类别的最小值”,在本例中是双向范围(因为向量具有随机遍历)。
\n
\n\n\n我已经迷失在输入 += 1,2,.... \xe2\x80\x93 user463035818 56 分钟前
\n
这就是 Boost 分配,与范围适配器无关,我敢说 C++11 让它基本上过时了,因为你可以很容易地说
\n\nstd::vector<int> input { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\nRun Code Online (Sandbox Code Playgroud)\n\n或者确实
\n\nstd::vector<int> input;\ninput.insert(input.end(), { 1, 2, 3, 4, 5, 6, 7, 8, 9 });\nRun Code Online (Sandbox Code Playgroud)\n