我有一些类的以下方法,它还定义了方法isAllowed:
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 :(得分:2)
我同意这是一个意见问题;但在我的意见中,基于算法的更清晰,因为名称copy_if
清楚地说明了您要完成的任务。
你(有条件地)复制了许多东西。