2010-11-06 10 views
5

quiero un partial_sum de mis elementos en un vector, donde cada elemento es un par. El partial_sum debe agregar incrementalmente los valores dobles (primero de cada par).STL partial_sum con vector <pair <double, uint>>? ¿Cómo implementar el functor binOp?

Ejemplo:

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 

me debe dar un vector que contiene: [(0,5, 0), (0,7, 1), (1,0, 2)]

¿Cómo implemento el necesario Functor para usar la función partial_sum?

Pude usar mi par en una búsqueda stl lower_bound con un functor personalizado, pero en el caso anterior, no sé cómo declarar la operación binaria.

No sé si ayuda, pero es posible usar la biblioteca de impulso.

Respuesta

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

Esto sumar los first s y devolver los second s sin cambios.

+0

excelente. Después de convertir su código en un functor con operator(), funcionó perfectamente. Exactamente lo que quería lograr Solo un comentario: su código es una función "normal". ¿Por qué no publicaste el functor? ¿Hay alguna razón? (Soy un tipo de novato en C++ en comparación con la gente de aquí, tal vez estoy mezclando los términos) – sascha

+0

@sascha: Tienes razón, esto no es un functor, yo era demasiado vago para escribirlo todo. Arreglará. –

+0

Muchas gracias. – sascha

1

Aquí hay una pequeña limpieza de https://stackoverflow.com/a/4113820/895245 con C++ lambdas, typedefs y una prueba ejecutable.

#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; 
    } 
} 

Salida:

0.5 0 
0.7 1 
1 2 

Si también desea calcular fácilmente los valores de probabilidad acumulada de cada probabilidad, echar un vistazo a: Running Part of Code with a Specified Probability

Cuestiones relacionadas