1

目前我正在运行一个 for 循环,在该循环中我对 STL 容器中的每个元素进行调用,类似于以下内容。

void AddToUpdate(iterator iter, Update& Update) {...};

...

Update update;
for(iterator iter = container.begin(); iter != container.end(); ++iter)
    AddToUpdate(iter, update);

我正在查看 for_each STL 算法,因为它似乎符合我的需要。

我想知道,考虑到对应用于容器的函数使用第二个输入参数,是否可以重构它以使用标准 STL 算法而不使用成员变量或其他漏洞?

4

2 回答 2

4

你想使用 std::bind2nd()- http://www.cplusplus.com/reference/std/functional/bind2nd/

基本上它从具有 2 个参数的函数返回一个一元函数对象,其中第二个参数是固定的。

这就是你的代码应该如何使用for_eachand bind2nd

Update update;
for_each(container.begin(), container.end(), bind2nd(ptr_fun(AddToUpdate), update));

编辑。正如 Matteo 注意到的第一个参数AddToUpdate必须是容器中的值类型,而不是迭代器。

于 2010-12-15T22:50:42.973 回答
4

创建了各种std::bind1st/std::bind2ndBoost.bind库来解决您的问题(这对几乎所有使用 STL 算法的人来说都很常见),但它们通常只是一种解决方法而不是解决方案。

幸运的是,随着即将到来的 C++ 标准,期待已久的lambda 函数的添加应该可以彻底解决这个问题。但是,请注意,由于std::for_each调用函子传递了取消引用的迭代器(即正在考虑的实际值),因此您的AddToUpdate函数不应该接受迭代器,而是接受值。

在这种情况下,它会是这样的:

Update update;
std::foreach(container.begin(); container.end(); [ & update](TypeOfTheValue Value) {
    AddToUpdate(Value, update);
});
于 2010-12-15T22:57:40.857 回答