C ++ вектор накапливается - PullRequest
       27

C ++ вектор накапливается

9 голосов
/ 22 ноября 2011

Я пытался использовать функцию накопления для векторов

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);

, однако, я всегда получал B = 0, в то время как A имел ненулевые значения

Ответы [ 2 ]

24 голосов
/ 22 ноября 2011

std::accumulate немного подлый в том смысле, что тип результата является типом начального значения, а не типом элементов контейнера!Таким образом, ваш аккумулятор выдает int s.

Чтобы исправить это, накапливайте в double:

accumulate(A.begin(), A.end(), 0.0);
//                             ^^^^^^^ literal of type double
2 голосов
/ 22 ноября 2011

ключ может быть в том, как вы делаете [...] // Заполняете значения в A `вектор A double B = 0;

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

разрешает B = 3.0

, еслипосле резервирования вы делаете [0] = 1, это плохой код.вместо этого вы можете сказать: изменить размер.

резерв дает только объем резервной памяти, фактически не создает действительных итераторов .. поэтому A.begin () по-прежнему равен A.end ()

Глядя на изменение кода, знаете ли вы разницу между целым числом и двойной математикой?члены 1 и 2 неотъемлемы?

...