Сумма std :: vector & lt; Object & gt; Переполнение стека

У меня есть пример класса:

class Example {
private:
int testValue1;
int testValue2;
int testValue3;

public:
Example(int pVal1, int pVal2, int pVal3);

Example(const Example);

const Example operator =(const Example);

inline int getValue1() { return testValue1; }

inline int getValue2() { return testValue2; }

inline int getValue3() { return testValue3; }

};

В исходном коде у меня есть std :: vector Пример объектов.

Возможно ли это с помощью какого-либо std :: алгоритма, функции std :: numeric составляют сумму Value1 всех объектов в векторе

что-то вроде этого:
std :: аккумулировать (vector.begin (), vector.end (), 0, SomeFunctorOrOthers) ….

Конечно, я могу использовать итераторы … но если это возможно, я хочу знать это

Большое спасибо!

3

Решение

Конечно:

int sum =
std::accumulate (begin(v), end(v), 0,
[](int i, const Object& o){ return o.getValue1() + i; });

Обратите внимание, что, так как Object const-ref передается в лямбду, вам нужно сделать геттеры const (это хорошая практика в любом случае).

Если у вас нет C ++ 11, вы можете определить функтор с перегруженным operator(), Я бы пошел дальше и сделал его шаблоном, чтобы вы могли легко решить, кому из геттеров вы хотите позвонить:

template<int (Object::* P)() const> // member function pointer parameter
struct adder {
int operator()(int i, const Object& o) const
{
return (o.*P)() + i;
}
};

Передайте это как алгоритм: adder<&Object::getValue2>()

7

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

std::accumulate(vector.begin(), vector.end(), 0, [](const int& a, Example& b)
{
return a + b.getValue1();
});
3

std::accumulate(v.begin(), v.end(), 0);

Этого достаточно, если вы перегрузите оператор приведения к int:

class Example {
...

operator int()  { return testValue1; }
};

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

2