Advertisement
AlexDanilin

С9. Урок 6-2 Концепция MapReduce, функции reduce и transform_reduce.

Aug 30th, 2023
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <random>
  4. #include <string>
  5. #include <string_view>
  6. #include <execution>
  7. #include <numeric>
  8.  
  9. #include "log_duration.h"
  10.  
  11.  
  12.  
  13. using namespace std;
  14.  
  15. string GenerateQuery(mt19937& generator, int max_length, int space_rate) {
  16.     const int length = uniform_int_distribution(0, max_length)(generator);
  17.     string query(length, ' ');
  18.     for (char& c : query) {
  19.         const int rnd = uniform_int_distribution(0, space_rate - 1)(generator);
  20.         if (rnd > 0) {
  21.             c = 'a' + (rnd - 1);
  22.         }
  23.     }
  24.     return query;
  25. }
  26.  
  27. template <typename Solver>
  28. void Test(string_view mark, string_view s, Solver solver) {
  29.     int result;
  30.     {
  31.         LOG_DURATION(mark);
  32.         result = solver(s);
  33.     }
  34.     cout << result << endl;
  35. }
  36.  
  37. #define TEST(solver) Test(#solver, s, solver)
  38.  
  39. int CountWords(string_view str) {
  40.     // подсчитайте количество слов,
  41.     // игнорируя начальные, конечные
  42.     // и подряд идущие пробелы
  43.     return transform_reduce(
  44.         execution::par,
  45.         next(str.begin()), str.end(),
  46.         str.begin(),
  47.         0L,
  48.         plus<>{},
  49.         [](char x, char prev_x) {
  50.             return x != ' ' && prev_x == ' ';
  51.         }) + (str[0] != ' ');
  52. }
  53.  
  54.  
  55. int main() {
  56.     // должно вывести 3
  57.     cout << CountWords("  pretty  little octopus "sv) << endl;
  58.  
  59.     mt19937 generator;
  60.  
  61.     const string s = GenerateQuery(generator, 100'000'000, 4);
  62.  
  63.     TEST(CountWords);
  64.  
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement