如何为关联容器应用std :: accumulate算法?

Ben*_*min 4 c++ algorithm stl map visual-studio-2008

对于像std :: map这样的地图,我如何积累它的值的总和?
实际上,我用functor和std :: for_each算法制作了它.但我也想用std :: accumulate算法做这个.
我不知道如何将它应用于std :: map.
这甚至可能吗?

struct Accumurator
    : std::unary_function<std::pair<int, int>, void>
{
    Accumurator()
        : totalValue_(0)
    {
    } 

    void operator()(const std::pair<int, int>& p)
    {
        totalValue_ += p.second;
    }

    int result() const
    {
        return totalValue_;
    }

    int totalValue_; 
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::map<int, int> m;
    m.insert(make_pair(1, 10));
    m.insert(make_pair(2, 10));
    m.insert(make_pair(3, 10));
    m.insert(make_pair(4, 10));
    m.insert(make_pair(5, 10));
    m.insert(make_pair(6, 10));

    int totalSum = std::for_each(m.begin(), m.end(), Accumurator()).result();

    // How can I apply accumulate algorithm for associative containers.
    // int totalSum = accumulate(m.begin(), m.end(), ???);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 6

几乎.仿函数必须是二元运算符,返回值类型为第一个,范围类型为第二个参数:

x = Functor(init, *it++);
x = Functor(x, *it++);
x = Functor(x, *it++);
// ... until it == end
Run Code Online (Sandbox Code Playgroud)

所以你根本不需要一个有状态的函子,一个简单的函数会做:

int map_acc(int lhs, const std::pair<int, int> & rhs)
{
  return lhs + rhs.second;
}

const int sum = std::accumulate(m.begin(), m.end(), 0, map_acc);
Run Code Online (Sandbox Code Playgroud)