根据this问题的第一个答案,下面的仿函数在传递给foreach
后应该能够保留一个值(我无法编译示例中的struct Accumulator
,因此构建了一个类)。
class Accumulator
{
public:
Accumulator(): counter(0){}
int counter;
void operator()(const Card & c) { counter += i; }
};
示例用法(根据示例)
// Using a functor
Accumulator acc;
std::for_each(_cards.begin(), _cards.end(), acc);
// according to the example - acc.counter contains the sum of all
// elements of the deque
std::cout << acc.counter << std::endl;
_cards
实现为 std::deque<Card>
。无论 _cards
得到多长时间,acc.counter
完成后 for_each
为零。当我逐步进入调试器时,我可以看到计数器在递增,但是这与 acc
按值传递有关吗? 最佳答案
这只是 asked here 。
原因是(如您所料) std::for_each
复制其仿函数,并调用它。但是,它也会返回它,因此如上面链接的答案所述,使用 for_each
的返回值。
就是说 ,你只需要使用 std::accumulate
:
int counter = std::accumulate(_cards.begin(), _cards.end(), 0);
仿函数和
for_each
在这里不正确。对于您的使用(计算一些,忽略其他),您可能需要提供自己的仿函数并使用
count_if
:// unary_function lives in <functional>
struct is_face_up : std::unary_function<const Card&, const bool>
{
const bool operator()(const card& pC) const
{
return pC.isFaceUp(); // obviously I'm guessing
}
};
int faceUp = std::count_if(_cards.begin(), _cards.end(), is_face_up());
int faceDown = 52 - faceUp;
和 C++0x lambda 的乐趣(只是因为):
int faceUp = std::count_if(_cards.begin(), _cards.end(),
[](const Card& pC){ return pC.isFaceUp(); });
好多了。
关于c++ - 当传递给 std::for_each 时,仿函数可以保留值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2102187/