Как реализовать функтор binOp для STLpart_sum с вектором>? - PullRequest
6 голосов
/ 06 ноября 2010

Мне нужна частичная_сумма моих элементов в векторе, где каждый элемент равен 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)]

Как реализовать необходимый функтор для использования функции part_sum?

Я смог использовать свою пару в поиске stl lower_bound с пользовательскимfunctor, но в приведенном выше случае я не знаю, как объявить двоичную операцию.

Ответы [ 2 ]

5 голосов
/ 06 ноября 2010
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 s и вернет second s без изменений.

2 голосов

Вот небольшая очистка https://stackoverflow.com/a/4113820/895245 с лямбдами C ++, typedefs и работоспособным тестом:

#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

Если вы также хотите легко рассчитать совокупные значения вероятностей для каждой вероятности, взгляните на: Выполнение части кода с заданной вероятностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...