我有一些類,它也限定了該方法的以下方法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循環。有沒有強有力的論據? (還有更好的方法嗎?)
否則,我覺得很癢,因爲像這樣的例子指出算法工具的有限性,儘管最佳實踐建議。
我投票結束主要基於意見 - 沒有事實答案。你可能在codereview.SE上運氣更好。 – orlp 2015-03-13 15:35:28
最終版本不贊成使用更通用的'bind(&A :: isAllowed,this,_1)'。但是風格化的「最佳實踐」是高度自以爲是的,所以這不是一個真正的可回答的問題。我會使用循環,因爲它更清晰。算法有時更清晰,但比不使用新樣式循環語法的次數更少。 – 2015-03-13 15:40:17