【发布时间】:2013-11-12 11:10:03
【问题描述】:
是否有 for_each 的标准实现,它使用元素和范围内的下一个元素进行调用?
例如取范围{0, 1, 2, 3, 4, 5},我想调用一个函数f,每个元素及其后继:{f(0, 1), f(1, 2), f(2, 3), f(3, 4), f(4, 5)}
注意最后一个元素是如何被遗漏的,因为它没有后继者。
如果能将其推广到与元素本身一起传递的 n 个后继者,那就太好了。
到目前为止,我一直通过带有迭代器的手写循环来解决这个问题。
但是,我想更多地遵循基于 for 或 std::for_each 的 C++11 范围,以避免样板代码。
示例
// today: handwritten loop
for(Range::iterator current = range.begin(); current != range.end(); ++current)
f(*current, *std::next(current));
// near future: wrapped version
for_each_pair(range.begin(), range.end(), f);
// slightly further future: generalized version
for_each_tuple<n>(range.begin(), range.end(), f);
其他问题
函数的名称可以改进。对我来说for_each_pair/tuple 听起来应该返回范围内所有大小为 n 的子集(这本身就是我想解决的另一个问题)。所以我想要一些更好的名字的建议,比如:
for_each_adjacent<n>
临时解决方案
我已经在CR 上发布了my own solution。我不会在这里重复它,因为这是一个标准解决方案,并且已经有足够的自己动手的答案。
【问题讨论】:
-
对 C++ 的
<algorithms>的快速浏览显示没有证据表明存在这种野兽,但这不是我第一次错过某些东西。您继续编写样板代码而不是将基于迭代器的解决方案模板化并将其放入您的工具箱中的任何特殊原因? -
@WhozCraig:到目前为止,只有必须有一个标准实现(std 或 boost)的唠叨感觉和纯粹的懒惰让我无法完成我自己的版本。
-
啊,我不能对 boost 发表评论,因为我从未使用过它(被依赖于其序列化算法的商业产品严重咬伤,该算法发生了变化;终身禁止工作)。看来您确实有能力做到这一点,甚至考虑过扩展(作为通用解决方案的元组方法是一个很好的方法)。您可能需要在一个下午打扫灰尘并将其塞住。 +1 有趣的问题,顺便说一句。
-
提醒一下:我在CR 上发布了一些与此相关的代码。当它更完善时,我可能会将其作为答案发布在这里。