3

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

#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;
}

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

4

1 回答 1

10

这里:

vector<int> vec(10);

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

然后,这里:

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

您再添加10 个从 1 到 10 的元素,这意味着您要添加 5 个偶数元素。因此偶数元素个数为15,输出正确。

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

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

然后,您应该将其重写为(例如):

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

附带说明一下,在 C++11 中,您可以使用新std::iota算法执行我猜您最初打算执行的操作:

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

// ...

iota(begin(vec), end(vec), 1);

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

for (int i = 1 ; i <= 10 ; ++i)
{
    vec[i] = i;
}
于 2013-05-17T12:00:17.330 回答