如何为STL partial_sum和vector<pair<double, uint>>实现binOp函数?

7

我希望对一个向量中的元素进行partial_sum计算,其中每个元素都是一个pair<double, unsinged int>partial_sum应该逐步添加双精度值(每个对中的第一个值)。

示例:

vector<pair<double, unsigned int> > temp_vec;
temp_vec.push_back(make_pair(0.5, 0));
temp_vec.push_back(make_pair(0.2, 1));
temp_vec.push_back(make_pair(0.3, 2));
partial_sum(temp_vec.begin(), temp_vec.end(), temp_vec.begin(), ???);   // in place

应该给我一个包含的向量:[(0.5, 0), (0.7, 1), (1.0, 2)]

如何实现必要的函数对象以使用partial_sum函数?

我能够在具有自定义函数对象的stl lower_bound搜索中使用我的pair,但在上述情况下,我不知道如何声明二元操作。

2个回答

5
struct pair_sum {
    pair<double, unsigned int> operator()(const pair<double, unsigned int> & sum, const pair<double, unsigned int> & i) {
        return pair<double, unsigned int>(sum.first + i.first, i.second);
    }
};

这将累加first并返回不变的second

非常好。将您的代码转换为带有operator()的函数对象后,它完美地工作了。正是我想要实现的效果。只有一个备注:您的代码是一个“普通”的函数。为什么没有发布函数对象呢?有什么原因吗?(与这里的人相比,我有点c++新手;也许我混淆了术语) - sascha
@sascha:你说得对,这不是一个函数对象,我只是懒得把它全部打出来。我会修复的。 - Björn Pollex

3

这是对https://dev59.com/_FHTa4cB1Zd3GeqPTq6D#4113820的轻微清理,使用了C++ lambda表达式、typedef和可运行的测试:

#include <functional>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    typedef std::pair<double, int> P;
    auto v = std::vector<P> {
        {0.5, 0},
        {0.2, 1},
        {0.3, 2}
    };
    std::partial_sum(v.begin(), v.end(), v.begin(),
        [](const P& x, const P& y){return P(x.first + y.first, y.second);}
    );
    for (auto &x : v) {
        std::cout << x.first << " " << x.second << std::endl;
    }
}

输出:

0.5 0
0.7 1
1 2

如果您想轻松计算每个概率的累积概率值,请查看以下链接:按指定概率运行代码一部分

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接