#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,这很奇怪。发生了什么事?
答案 0 :(得分:10)
下面:
vector<int> vec(10);
首先使用值初始化元素创建大小为10
的向量,因此所有元素都具有值0
(这可能是您误解的部分)。
然后,在这里:
for (int i = 1 ; i <= 10 ; ++i)
{
vec.push_back(i);
}
你添加 10个元素,范围从1到10,这意味着你要添加exaclty 5 even元素。因此,偶数元素的数量是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;
}