count_if()的算术错误

Mau*_*uez 3 c++ algorithm lambda

当我遇到这个奇怪的错误时,我正在尝试算法和lambdas:

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

using namespace std;

int main(int argc, char *argv[])
{
    vector<int> vec(10);
    int OddCount;

    for (int i = 1 ; i <= 10 ; ++i)
    {
        vec.push_back(i);
    }

    OddCount = count_if(vec.begin(),vec.end(),[](int v){return v%2 == 0;});

    cout<<OddCount<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道向量vec,包含值1 - 10,当我使用count_if算法检查奇数时,它返回预期的数字,即5(1,3,5,7,9)但当我检查时偶数我得到的结果= 15,这很奇怪.这是怎么回事?

And*_*owl 10

这里:

vector<int> vec(10);
Run Code Online (Sandbox Code Playgroud)

首先10使用值初始化元素创建一个大小的向量,因此所有元素都具有值0(这可能是您误解的部分).

然后,在这里:

for (int i = 1 ; i <= 10 ; ++i)
{
    vec.push_back(i);
}
Run Code Online (Sandbox Code Playgroud)

您还可以添加 10个元素,范围从1到10,这意味着您要添加exaclty 5 even元素.因此,偶数元素的数量是15,并且输出是正确的.

另请注意,您的谓词确实选择偶数,而不是奇数(这似乎是您的意图):

[](int v){return v%2 == 0;}
//                   ^^^^
//                   This makes your predicate select EVEN numbers!
Run Code Online (Sandbox Code Playgroud)

然后你应该重写它(例如):

[](int v){return v%2 != 0;}
//                   ^^^^
//                   This makes your predicat select ODD numbers
Run Code Online (Sandbox Code Playgroud)

作为旁注,在C++ 11中,您可以使用新std::iota算法执行我认为您最初打算做的事情:

#include <algorithm> // <== NECESSARY FOR std::iota

// ...

iota(begin(vec), end(vec), 1);
Run Code Online (Sandbox Code Playgroud)

这与(在C++ 03中)相同:

for (int i = 1 ; i <= 10 ; ++i)
{
    vec[i] = i;
}
Run Code Online (Sandbox Code Playgroud)