c ++ operator()行为

sev*_*bit 2 c++ c++-standard-library

考虑一下,我使用std :: for_each和带有重载operator()的对象来累积一些有关向量内容的数据:

#include <iostream>
#include <vector>
#include <algorithm>

struct A{
    int a;
    A(): a(0){}

    void operator()(int i) {
        if(i)   a++;
        std::cout << "a:" << a << std::endl;
    }
};

int main(int argc, char *argv[]) {
    //test data
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(1);
    vec.push_back(0);

    //accumulator
    A accum;

    std::for_each(vec.begin(), vec.end(), accum);
    std::cout << "non-zero elements:" << accum.a << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

a:1
a:2
a:2
non-zero elements:0
Run Code Online (Sandbox Code Playgroud)

为什么是non-zero elements0?

hmj*_*mjd 6

std::for_each()并不需要通过参考其第三个参数,所以复制accum制成.

如果您向自己添加std::cout语句,则A::A()可以看到此行为.

请注意,您可以使用std::count_if()以下方法解决此特定问题:

std::cout << "non-zero elements: "
          << std::count_if(vec.begin(),
                           vec.end(),
                           [](const int i) { return i != 0; })
          << std::endl;
Run Code Online (Sandbox Code Playgroud)