2013-05-17 40 views
3

我用算法和lambda表達式進行試驗,當我遇到這個奇怪的錯誤來了:算術錯誤與count_if()

#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

體積%2 == 0意味着v甚至會,所以你實際上是計數偶數,並不奇怪。 –

+0

對不起,對不起。 –

回答

10

這裏:

vector<int> vec(10); 

首先創建大小10與值初始化元素的載體,因此,所有具有價值0(這可能是你被誤解的部分)。

然後,在這裏:

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

添加另外10元從1到10,這意味着你要添加exaclty 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算法做什麼,我猜你本來米eant做:

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

// ... 

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

這是相同的(在C++ 03):

for (int i = 1 ; i <= 10 ; ++i) 
{ 
    vec[i] = i; 
} 
+0

在插入項目之前可以有一個預先分配矢量的理由(儘管對於10個項目不是真的)。如果你想盡早獲得所有的內存分配,爲一個巨大的向量保留內存(所以你不會獲得大量的重新分配),但是不要將項目放入內存中,可以使用['vector :: reserve'] (http://www.cplusplus.com/reference/vector/vector/reserve/)方法。 – Steve314

+0

@ Steve314:對,但這並不是接受'std :: size_t'的構造函數所做的(雖然這也許是OP的預期) –

+0

謝謝,這是預分配造成的錯誤,(我認爲push_back()會只是把價值和沒有別的) –