簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM