std :: vector <object>成员C ++ </object>的总和

时间:2013-10-17 11:32:26

标签: c++ sum stdvector accumulate

我有示例类:

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 :: algorithm,std :: numeric函数使向量中所有Obejcts的Value1之和

这样的事情: std :: accumulate(vector.begin(),vector.end(),0,SomeFunctorOrOthers)....

当然我可以使用迭代器......但如果有可能,我想知道它

非常感谢!

3 个答案:

答案 0 :(得分:8)

不确定

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

请注意,由于Object由const-ref传递给lambda,因此你需要制作getter 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>()

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

如果您为int

重载运算符强制转换就足够了
class Example {
  ...

  operator int()  { return testValue1; }
};

缺点是,您可能不希望此过载通常适用于您的班级。