2017-10-11 123 views
4
#include <iostream> 
#include <vector> 
#include <numeric> 
#include <iterator> 

using namespace std; 

int main() 
{ 
    int N; 
    cin>>N; 
    long long int x,sum=0; 
    std::vector<long long int> v; 
    for(int i=0;i<N;i++) 
    { 
     cin>>x; 
     v.push_back(x); 
    } 
    /*vector<long long int>::iterator itr; 
    itr = v.begin(); 
    for(itr=v.begin();itr<v.end();itr++) 
     sum += *itr;*/ 
    sum = accumulate(v.begin(),v.end(),0); 
    cout<<sum; 
    return 0; 
} 

我的程序正在使用accumulate返回抽象值,但是如果我使用for循環,則答案即將到來。包含使用累積long long int的向量的求和

+0

@ tobi303:這聽起來像一個答案。 (實際上,它*是答案,OP已經實例化了std :: accumulate long long int> :: iterator,int>') –

+0

@MartinBonner我只是不確定,但完全同意,它不應該是一個評論... – user463035818

+0

'std :: accumulate'具有初始值的單獨模板參數。沒有限制,它必須是與元素相同的類型。使用'int'唯一可能的問題就是溢出,真的。 – chris

回答

7

std::accumulate有一個小缺陷,就是您傳遞的初始值。人們可以很容易地忽略這個值用於推斷參數T也是返回類型(並且返回類型是而不是需要容器的value_type)。通過傳遞long long作爲初始值修正:

sum = accumulate(v.begin(),v.end(),(long long)0); 

或爲paranoics(對不起只是開玩笑原料石膏真的不是很好):

sum = accumulate(v.begin(),v.end(),0LL); 
+2

@Ron:甚至是'0LL'。 – Jarod42

+3

如果他們只讓'T'成爲第一個模板參數,那麼可以明確指定它。 – user2079303

+0

@ Jarod42同意。 – Ron