![](/img/trans.png)
[英]boost::adaptors::transformed followed by boost::adaptors::filtered calls function twice
[英]What is the effect of the pipe operator in c++ boost::adaptors::filtered?
在boost::adaptors::filtered
,filter函數使用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
定義,它是否是一個重載? 如果是這樣,如何有效地在像lib這樣的圖書館中搜索這樣的運算符?
這是一個Boost范圍適配器 。 本在線書籍“The Boost C ++ Libraries”中已經編寫了更多文檔。
有許多這樣的范圍,可以組成寫高級功能的效果。 示例如下:
filtered
適配器 input | filtered(is_even())
input | filtered(is_even())
創建適配器類型的臨時實例:
boost::range_detail::filtered_range<is_even, std::vector<int> >
這是一種模型Range Concept的類型,它包含對源范圍( input
)的引用以及過濾謂詞的副本( is_even()
)。
然后實現范圍概念,使得范圍的迭代產生雙向范圍,就好像它僅具有滿足過濾謂詞的源范圍的元素一樣。 你可以同樣寫:
is_even predicate;
for (auto const& i : input)
if (predicate(i))
std::cout << i << ",";
range | adaptor
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 );
}
注意:斷言僅驗證所需的最小遍歷類別。 如上所述,您將獲得“rng和雙向范圍的范圍類別的最小值” ,在這種情況下是雙向范圍(因為向量具有隨機遍歷)。
我已輸入+ = 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 });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.