shushus

Спринт 9. Накладные расходы на вызов async.

Mar 6th, 2023 (edited)
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <random>
  5. #include <vector>
  6. #include <future>
  7. #include <execution>
  8.  
  9. using namespace std;
  10.  
  11. template <typename It>
  12. void PrintRange(It range_begin, It range_end) {
  13.     for (auto it = range_begin; it != range_end; ++it) {
  14.         cout << *it << " "s;
  15.     }
  16.     cout << endl;
  17. }
  18.  
  19. template <typename RandomIt>
  20. void MergeSort(RandomIt range_begin, RandomIt range_end, int async_ = 0) {
  21.  
  22.     int range_length = range_end - range_begin;
  23.     if (range_length < 2) {
  24.         return;
  25.     }
  26.  
  27.     vector elements(range_begin, range_end);
  28.     auto mid = elements.begin() + range_length / 2;
  29.    
  30.     auto right = [mid, end = elements.end(), async_] {
  31.         MergeSort(mid, end, 1 + async_);
  32.     };
  33.  
  34.     auto left = [begin = elements.begin(), mid, async_] {
  35.         MergeSort(begin, mid, 1 + async_);
  36.     };
  37.    
  38.     if (2 >= async_) {                                     //max_async
  39.         auto right_async = async(right);
  40.         left();
  41.         right_async.get();
  42.     } else {
  43.         right();
  44.         left();
  45.     }
  46.  
  47.     merge(execution::par, elements.begin(), mid, mid, elements.end(), range_begin);
  48. }
  49.  
  50. int main() {
  51.     mt19937 generator;
  52.  
  53.     vector<int> test_vector(10);
  54.  
  55.     iota(test_vector.begin(), test_vector.end(), 1);
  56.  
  57.     shuffle(test_vector.begin(), test_vector.end(), generator);
  58.  
  59.     PrintRange(test_vector.begin(), test_vector.end());
  60.  
  61.     MergeSort(test_vector.begin(), test_vector.end());
  62.  
  63.     PrintRange(test_vector.begin(), test_vector.end());
  64.  
  65.     MergeSort(test_vector.data(), test_vector.data() + test_vector.size());
  66.  
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment