2015-03-02 1 views
-1

Я хочу суммировать 12 чисел за раз (для имитации года), затем добавляя результаты к отдельному вектору, но я похоже, борется. Я попытался получить 12 чисел за раз в цикл, но я не уверен. Вот пример из текстового файла, который я читаю., используя аккумулирование, чтобы суммировать 12 чисел за один раз от одного вектора, а затем добавить результат к другому вектору. C++

+3

Что именно здесь вопрос? – Borgleader

+0

Если вы посмотрите на ['std :: accumulate'] (http://en.cppreference.com/w/cpp/algorithm/accumulate), в качестве аргументов требуется пара итераторов. И векторный итератор - это произвольный доступ, поэтому вы можете легко сделать это, например. 'myVector.begin() + 12', чтобы получить итератор для 13-го элемента вектора. –

+0

@Borgleader Как я могу добавить 12 элементов за один раз из моего вектора осадков, а затем добавить результаты в новый вектор. – louiej15

ответ

0

Вы должны аккумулировать значение для каждого года, что означает 12 последовательных элементов в вашем входном векторе.
Каждый раз, когда вы нажимаете на 12-й элемент, ваш аккумулятор имеет ожидаемое значение.

double currentrain = 0; 
for(int i = 0; i < rainfall.size(); ++i) { 
    // accumulate rain this year 
    currentrain += rainfall[i]; 
    // i%12==11 on december 
    if((i%12)!=11) 
     continue; 
    // we have accounted each month in this year 
    sum.push_back(currentrain); 
    // reset the accumulator for next year 
    currentrain = 0; 
} 
+0

Это имеет смысл теперь спасибо! Быстрый вопрос при отображении результата i.e for (int j = 0; j louiej15

+0

@ louiej15 вам понадобится какая-то структура данных для этого, так что вместо хранения векторов двойников вы будете хранить векторы структур. Одна структура будет содержать {int year; int month; double rainmm;}, а другой {int year; double rainmm;}. Я оставлю все остальное вам, поскольку оно выходит за рамки вашего первоначального вопроса (и когда я говорю «struct», я действительно считаю класс, но это зависит от вас и объема этого проекта). – birdypme

0

Вы можете использовать зЬй :: скапливаются непосредственно:

vector<double> result; 
for (auto it = begin(rainfall); it+12<=rainfall.end(); it+=12) 
    result.emplace_back(accumulate(it, it+12, 0)); 
+0

Будьте осторожны, если 'it + 12' находится за пределами' std :: end (rainfall) '. –

+0

@JoachimPileborg Ну, я отредактировал его, чтобы просто пропустить последний, если он неполный, теперь он намного проще. – tux3