始终使用最能描述您打算做什么的变量。那是
对于每一个元素x
中vec
,这样做bar.process(x)
。
现在,让我们检查示例:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
我们有一个for_each
在那里,太- yippeh。我们拥有[begin; end)
要操作的范围。
原则上,该算法更加明确,因此比任何手写实现都更可取。但是然后 ...粘合剂?Memfun?基本上C ++内部如何获取成员函数?对于我的任务,我不在乎它们!我也不希望遭受这种冗长而令人毛骨悚然的语法的困扰。
现在另一种可能性:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
当然,这是一种常见的模式,可以识别,但是...创建迭代器,循环,递增,取消引用。为了完成任务,我也不关心这些。
诚然,它看起来WAAY比第一个解决方案(至少,循环体是灵活的,非常明确),但尽管如此,它不是真的是太棒了。如果没有更好的可能性,我们将使用此方法,但也许我们有...
有更好的方法吗?
现在回到for_each
。那岂不是巨大的字面上说for_each
,并在将要进行的操作是灵活的,太?幸运的是,由于C ++ 0x lambda,
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
现在,我们已经找到了针对许多相关情况的抽象通用解决方案,值得注意的是,在这种特定情况下,绝对是#1的最爱:
foreach(const Foo& x, vec) bar.process(x);
确实没有比这更清楚的了。幸运的是,C ++ 0x 内置了类似的语法!
map(bar.process, vec)
尽管不建议使用map来产生副作用,并且建议在map上使用列表理解/生成器表达式)。