【问题标题】:How to apply std::accumulate algorithm for associative containers?如何为关联容器应用 std::accumulate 算法?
【发布时间】:2011-10-19 14:11:50
【问题描述】:

对于像 std::map 这样的地图,我如何累积它的值的总和?
实际上,我是用仿函数和 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;
}

【问题讨论】:

    标签: c++ algorithm visual-studio-2008 stl map


    【解决方案1】:

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

    x = Functor(init, *it++);
    x = Functor(x, *it++);
    x = Functor(x, *it++);
    // ... until it == end
    

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

    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);
    

    【讨论】:

    • 啊哈,_Fn2 类型表示二进制函数/函子?有帮助。我没有注意到这一点。
    【解决方案2】:

    std::accumulate 需要一个 init 参数和一个二进制操作来执行。 您的二元运算需要接受一对作为第二个参数和 int 作为第一个参数并返回 int。

    struct pair_add {
      int operator()(int i, const std::pair<int, int>& x) {
        return i + x.second;
      }
    };
    //use as
    int totalSum = accumulate(m.begin(), m.end(), 0, pair_add());
    

    真正的问题是让函子尽可能通用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多