shushus

Спринт 9. О размере критической области.

Mar 6th, 2023
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <random>
  5. #include <string>
  6. #include <string_view>
  7. #include <vector>
  8. #include <mutex>
  9. #include <execution>
  10.  
  11. #include "log_duration.h"
  12.  
  13. using namespace std;
  14.  
  15. string GenerateWord(mt19937& generator, int max_length) {
  16.     const int length = uniform_int_distribution(1, max_length)(generator);
  17.     string word;
  18.     word.reserve(length);
  19.     for (int i = 0; i < length; ++i) {
  20.         word.push_back(uniform_int_distribution('a', 'z')(generator));
  21.     }
  22.     return word;
  23. }
  24.  
  25. template <template <typename> typename Container>
  26. Container<string> GenerateDictionary(mt19937& generator, int word_count, int max_length) {
  27.     vector<string> words;
  28.     words.reserve(word_count);
  29.     for (int i = 0; i < word_count; ++i) {
  30.         words.push_back(GenerateWord(generator, max_length));
  31.     }
  32.     return Container(words.begin(), words.end());
  33. }
  34.  
  35. template <typename Strings, typename Predicate, typename Function>
  36. void Test(string_view mark, const Strings& strings, Predicate predicate, Function function) {
  37.     LOG_DURATION(mark);
  38.     const auto result = function(strings, predicate);
  39.     cout << result.size() << " " << result[5].substr(0, 5) << endl;
  40. }
  41.  
  42. #define TEST(function) \
  43.     Test(#function, strings, predicate, function<vector<string>, decltype(predicate)>)
  44.  
  45. template <typename Container, typename Predicate>
  46. vector<typename Container::value_type> CopyIfUnordered(const Container& container,
  47.                                                        Predicate predicate) {
  48.    
  49.     vector<typename Container::value_type> result;
  50.     result.reserve(container.size());
  51.    
  52.     mutex m_result;
  53.     for_each(execution::par,
  54.              container.begin(),
  55.              container.end(),
  56.              [predicate, &m_result, &result](const auto& i) {
  57.                 if (predicate(i)!=0) {
  58.                     typename Container::value_type* helper;
  59.                     {
  60.                         lock_guard lock_guard_mutex(m_result);
  61.                         helper = &result.emplace_back();
  62.                     }
  63.                    
  64.                     *helper = i;
  65.                 }
  66.             });
  67.     return result;
  68. }
  69.  
  70. int main() {
  71.     vector<int> numbers(1'000);
  72.    iota(numbers.begin(), numbers.end(), 0);
  73.  
  74.    const vector<int> even_numbers = CopyIfUnordered(numbers, [](int number) {
  75.        return number % 2 == 0;
  76.    });
  77.    for (const int number : even_numbers) {
  78.        cout << number << " "s;
  79.    }
  80.    cout << endl;
  81.  
  82.    mt19937 generator;
  83.  
  84.    const auto strings = GenerateDictionary<vector>(generator, 50'000, 3000);
  85.     auto predicate = [](const string& s) {
  86.         return count(s.begin(), s.end(), 'a') < 100;
  87.     };
  88.  
  89.     TEST(CopyIfUnordered);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment