transform_reduce & избавление от цикла for - PullRequest
1 голос
/ 15 января 2020

, поэтому я сейчас перебираю часть своего кода и пытаюсь избавиться от некоторых циклов for, которые мне не нравятся, и пытаюсь получить больше опыта со стандартными алгоритмами. Итак, l oop, который у меня есть, теперь можно объяснить лучше всего по следующему фрагменту кода:

// Defined struct
struct A {
  /* stuff */
  size_t computed_value() const { /* ... */ return value; }
};

// In other location in code
std::vector<A> vecA;
// ... insert tons of A's into vecA

size_t summed_value = 0;
for(const auto& a : vecA) {
  summed_value += a.computed_value();
}

Это l oop Я хочу заменить стандартным алгоритмом, и я подумал, что нашел идеальное соответствие .. std::transform_reduce в numeric заголовок, но кажется, что ни в моей версии clang или g ++ эта функция не включена ..? Некоторые другие вещи, о которых я подумал: std::accumulate, но это требует неявного преобразования A в int (насколько я могу судить) & std::transform, но я не смог найти способ использовать int или size_t в качестве выходного значения .

Примечание. На данный момент я готов использовать только до C ++ 17.

У кого-нибудь есть какие-либо советы по поводу функции, которую я должен изучить? Спасибо!

1 Ответ

4 голосов
/ 15 января 2020

Функция std::accumulate должна работать очень хорошо:

size_t summed_value = std::accumulate(begin(vecA), end(vecA), 0, [](size_t acc, A const& a)
{
    return acc + a.computed_value();
});
...