2015-03-13 20 views
2

我有一些類,它也限定了該方法的以下方法isAllowed:copy_if算法在這裏值得嗎?

auto filter(const auto& in) 
{ 
    auto ret = decltype(in) {}; 
    for(auto x : in) 
     if(isAllowed(x)) 
     ret.insert(x); 
    return ret; 
} 

這是copy_if可以替代地使用一個明確的情況下。我看到兩個替代版本:

auto filter(const auto& in) 
{ 
    auto ret = decltype(in) {}; 
    copy_if(begin(in), end(in), 
      inserter(ret, end(ret)), 
      [this](auto i) {return this->isAllowed(i);}); 
    return ret; 
} 

auto filter(const auto& in) 
{ 
    auto ret = decltype(in) {}; 
    copy_if(begin(in), end(in), 
      inserter(ret, end(ret)), 
      bind1st(mem_fn(&A::isAllowed), this)); // I believe this is deprecated 
    return ret; 
} 

雙方似乎比原來明顯要少得多,所以我傾向於保持for循環。有沒有強有力的論據? (還有更好的方法嗎?)

否則,我覺得很癢,因爲像這樣的例子指出算法工具的有限性,儘管最佳實踐建議。

+0

我投票結束主要基於意見 - 沒有事實答案。你可能在codereview.SE上運氣更好。 – orlp 2015-03-13 15:35:28

+2

最終版本不贊成使用更通用的'bind(&A :: isAllowed,this,_1)'。但是風格化的「最佳實踐」是高度自以爲是的,所以這不是一個真正的可回答的問題。我會使用循環,因爲它更清晰。算法有時更清晰,但比不使用新樣式循環語法的次數更少。 – 2015-03-13 15:40:17

回答

2

我同意這是一個意見問題;但在我的的意見,基於算法的更清晰,因爲名稱copy_if明確你想要完成。

你(有條件地)複製一堆東西。

+0

+1。我認爲許多代碼閱讀器必須先確定copy_if的含義。另一方面,很難確定來源和目標,以及過濾條件(in,ret和isAllowed在它們周圍被更多的亂碼所掩蓋) – ricab 2015-03-13 17:16:25