Вычислить сумму части вектора с помощью std :: аккумулята

Имея этот вектор

vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

как я могу вычислить сумма первой половины из этого (что составляет 15) с использованием скапливаться функционировать?

Могу ли я сделать это, используя цикл for только с итераторами (не числовые индексы)?

5

Решение

Вы можете

accumulate(v.begin(), v.begin()+int(v.size()/2), 0)

если v это твой вектор.

Вы также можете написать цикл:

int sum = 0;
for (vector<int>::iterator it = v.begin(); it != v.begin+int(v.size()/2); ++it) {
sum += *it;
}
7

Другие решения

Чтобы работать только с первой половиной, вы должны получить итераторы, которые охватывают только этот диапазон. Обычно люди хотят работать с целым контейнером и поэтому используют начальную и конечную функции, но это не единственный способ:

auto begin = std::begin(v);
auto middle = std::begin(v) + v.size()/2; // works for random access iterators

auto middle = begin;
std::advance(middle, v.size()/2);

advance работает для входных итераторов или лучше, но для входных итераторов, которые также не относятся к другим типам, переданные расширенные элементы больше не будут доступны.

auto middle = std::next(begin, v.size()/2); // C++11. works for forward iterators

И это только некоторые из доступных операций, которые вы можете выполнять с различными типами итераторов.


Так что теперь, когда вы можете создавать итераторы, которые задают желаемый диапазон, вы можете использовать их либо в std :: накоплении, либо в руководстве для цикла:

std::accumulate(std::begin(v), std::next(std::begin(v), v.size()/2), 0);

for (auto begin(std::begin(v)), end(begin+v.size()/2); begin!=end; ++begin) {
...
}
3

accumulate<int>(v.cbegin(), v.cbegin() + v.size()/2, 0);
1

int sum = std :: накопить (v.begin (), v.begin () + v.size () / 2, 0);

1
По вопросам рекламы [email protected]