2016-01-05 3 views
2

Я пытаюсь получить суть RxCpp, встроенной реализации CPP реактивных расширений от Microsoft, чтобы увидеть, могу ли я использовать его в проекте, но у меня возникают проблемы с обволакиванием концепций.Совокупные функции групп с использованием rxcpp?

Если бы я был наблюдаемым шаблонный со следующей структурой:

struct Person 
{ 
    std::string name; 
    std::string sex; 
    int age; 
} 

Как создать другой наблюдаемым, который содержал, сгруппированных по признаку пола, количество людей, мин возраст, макс возраст и средний возраст всех события?

Я рассмотрел примеры, и я не могу понять, как получить больше одного агрегата за раз.

ответ

2

Используйте group_by для разделения по полу, а затем объедините минимальные/максимальные/средние редукторы для получения желаемого результата для каждого пола.

Обновлен подсчетом, вывод и дополнительные комментарии

Это работает для меня:

#include "rxcpp/rx.hpp" 
using namespace rxcpp; 
using namespace rxcpp::sources; 
using namespace rxcpp::subjects; 
using namespace rxcpp::util; 

using namespace std; 

struct Person 
{ 
    string name; 
    string gender; 
    int age; 
}; 

int main() 
{ 
    subject<Person> person$; 

    // group ages by gender 
    auto agebygender$ = person$. 
     get_observable(). 
     group_by(
      [](Person& p) { return p.gender;}, 
      [](Person& p) { return p.age;}); 

    // combine min max and average reductions. 
    auto result$ = agebygender$. 
     map([](grouped_observable<string, int> gp$){ 
      // the function passed to combine_latest 
      // will be called once all the source streams 
      // (count, min, max, average) have produced a 
      // value. in this case, all the streams are reducers 
      // that produce only one value when gp$ completes. 
      // thus the function is only called once per gender 
      // with the final value of each stat. 
      return gp$. 
       count(). 
       combine_latest(
        [=](int count, int min, int max, double average){ 
         return make_tuple(gp$.get_key(), count, min, max, average); 
        }, 
        gp$.min(), 
        gp$.max(), 
        gp$.map([](int age) -> double { return age;}).average()); 
     }). 
     // this map() returns observable<observable<tuple<string, int, int, int, double>>> 
     // the merge() returns observable<tuple<string, int, int, int, double>> 
     // a grouped observable is 'hot' if it is not subscribed to immiediatly (in this case by merge) 
     // then the values sent to it are lost. 
     merge(); 

    // display results 
    result$. 
     subscribe(apply_to([](string gender, int count, int min, int max, double avg){ 
      cout << gender << ": count = " << count << ", range = [" << min << "-" << max << "], avg = " << avg << endl; 
     })); 

    //provide input data 
    observable<>::from(
     Person{"Tom", "Male", 32}, 
     Person{"Tim", "Male", 12}, 
     Person{"Stel", "Other", 42}, 
     Person{"Flor", "Female", 24}, 
     Person{"Fran", "Female", 97}). 
     subscribe(person$.get_subscriber()); 

    return 0; 
} 

с результирующим выходом

Female: count = 2, range = [24-97], avg = 60.5 
Male: count = 2, range = [12-32], avg = 22 
Other: count = 1, range = [42-42], avg = 42 
+0

Спасибо, что выглядит великолепно. Несколько вопросов: Почему вы должны использовать [=] и изменять в первом аргументе group_by? Можете ли вы добавить дополнительные комментарии в разделе, в котором сочетаются min max и average? Я не совсем понимаю, что там происходит. Наконец, очевидно, что вы отлично знаете rxxcpp, так как вы работали над библиотекой, какие-либо советы по обучению эффективному использованию? – bpeikes

+1

[=] capture и mutable были артефактами предыдущего примера, я удалил их и добавил больше комментариев. Большинство концепций, необходимых для использования rxcpp, являются общими для других реализаций Rx. Это здорово, так как другие ресурсы могут быть повторно использованы. Эта страница - это то, как я раскрыл себе эти общие концепции: http://reactivex.io/learnrx/. Я рад обсудить конкретные вопросы rxcpp. другие ресурсы: docs - http://reactive-extensions.github.io/RxCpp/ и chat - https://gitter.im/Reactive-Extensions/RxCpp –

Смежные вопросы