2011-11-22 49 views
8

Tôi đã cố gắng sử dụng các chức năng tích lũy cho vectơC++ vector tích lũy

vector <double> A; 
double B = 0; 

A.reserve(100); 
for(itr = 0; itr < 210; itr++) 
{ 
    term1 = pow(r[itr], 12); 
    term1 = 1/term1; 
    term2 = pow(r[itr], 6); 
    term2 = 2/term2; 
    A.push_back(term1 - term2); 
} 
B = accumulate(A.begin(), A.end(), 0); 
tuy nhiên

, tôi luôn luôn có B = 0, trong khi A có giá trị khác không

+2

Chúng ta có thể thấy đoạn mã đó lấp đầy A? –

+0

Bạn nên đăng một ví dụ mã tối thiểu để tái tạo vấn đề của mình. Đoạn mã này không thực sự hữu ích. –

+0

Cần thêm mã ngoại lệ. – hochl

Trả lời

23

std::accumulate hơi lén lút theo nghĩa là loại kết quả là loại giá trị ban đầu và không phải là loại phần tử vùng chứa! Vì vậy, bộ tích lũy của bạn tạo ra int s.

Để sửa lỗi này, tích lũy thành một double:

accumulate(A.begin(), A.end(), 0.0); 
//        ^^^^^^^ literal of type double 
+1

Bạn là một thiên tài! – Josh

+1

+1 cái này rất khó. – hochl

2

phím có thể như thế nào bạn đang làm [ ...] // Điền các giá trị vào A ` vector A double B = 0;

A.reserve(100); 
A.push_back(1); 
A.push_back(2); 
B = accumulate(A.begin(), A.end(), 0); 
return 0; 

giải quyết B = 3,0

nếu sau khi dự trữ bạn đang làm một [0] = 1 đây là mã xấu. những gì bạn có thể muốn làm thay vào đó là nói thay đổi kích cỡ.

dự trữ chỉ mang đến cho bạn dung lượng bộ nhớ sự ủng hộ, nó không thực sự tạo ra các vòng lặp có giá trị .. vì vậy A.begin() vẫn bằng A.end()

nhìn vào sự thay đổi mã, bạn có biết các khác nhau giữa số nguyên và toán học đôi? là term1 và term 2 không thể thiếu?

+1

họ là đôi, và tôi đã có một vấn đề với tuyên bố tích lũy (tôi đã phải đặt trong 0.0) ... khá lén lút – Josh

Các vấn đề liên quan