shushus

Спринт 13. Зачем так мучиться, если оно и так работает.

Apr 16th, 2023
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. enum class Gender {FEMALE, MALE};
  9.  
  10. struct Person {
  11.     int age;          
  12.     Gender gender;    
  13.     bool is_employed;  
  14. };
  15.  
  16. struct Stats {
  17.     int people;
  18.     int females;
  19.     int males;
  20.     int employed_females;
  21.     int not_employed_females;
  22.     int employed_males;
  23.     int not_employed_males;
  24. };
  25.  
  26. template <typename InputIt>
  27. int ComputeMedianAge(InputIt range_begin, InputIt range_end) {
  28.  
  29.     if (range_begin == range_end) {
  30.         return 0;
  31.     }
  32.    
  33.     vector<typename InputIt::value_type> range_copy(range_begin, range_end);
  34.     auto middle = range_copy.begin() + range_copy.size() / 2;
  35.     nth_element(range_copy.begin(), middle, range_copy.end(), [](const Person& lhs, const Person& rhs) {
  36.         return lhs.age < rhs.age;
  37.     });
  38.    
  39.     return middle->age;
  40. }
  41.  
  42. Stats PrintStats(vector<Person>& people_) {
  43.    
  44.     auto males_it = std::partition(begin(people_), end(people_),
  45.                                 [](const Person& person) {return person.gender == Gender::MALE;});
  46.                          
  47.     auto employed_males_it = std::partition(begin(people_), males_it,
  48.                                          [](const Person& person) {return person.is_employed;});
  49.                                    
  50.     auto employed_females_it = std::partition(males_it, end(people_),
  51.                                            [](const Person& person) {return person.is_employed;});
  52.  
  53.     std::cout  << "Median age = "
  54.                << ComputeMedianAge(begin(people_), end(people_)) << std::endl
  55.                
  56.                << "Median age for females = "
  57.                << ComputeMedianAge(males_it, end(people_)) << std::endl
  58.                
  59.                << "Median age for males = "
  60.                << ComputeMedianAge(begin(people_), males_it) << std::endl
  61.                
  62.                << "Median age for employed females = "
  63.                << ComputeMedianAge(males_it,  employed_females_it) << std::endl
  64.                
  65.                << "Median age for unemployed females = "
  66.                << ComputeMedianAge(employed_females_it, end(people_)) << std::endl
  67.                
  68.                << "Median age for employed males = "
  69.                << ComputeMedianAge(begin(people_), employed_males_it) << std::endl
  70.                
  71.                << "Median age for unemployed males = "
  72.                << ComputeMedianAge(employed_males_it, males_it) << std::endl;
  73.  
  74.     return {
  75.         ComputeMedianAge(begin(people_), end(people_)),
  76.         ComputeMedianAge(males_it, end(people_)),
  77.         ComputeMedianAge(begin(people_), males_it),
  78.         ComputeMedianAge(males_it,  employed_females_it),
  79.         ComputeMedianAge(employed_females_it, end(people_)),
  80.         ComputeMedianAge(begin(people_), employed_males_it),
  81.         ComputeMedianAge(employed_males_it, males_it)
  82.     };
  83. }
  84.  
  85. int main() {
  86.     vector<Person> persons = {
  87.         {31, Gender::MALE, false},   {40, Gender::FEMALE, true},  {24, Gender::MALE, true},
  88.         {20, Gender::FEMALE, true},  {80, Gender::FEMALE, false}, {78, Gender::MALE, false},
  89.         {10, Gender::FEMALE, false}, {55, Gender::MALE, true},
  90.     };
  91.     PrintStats(persons);
  92. }
Advertisement
Add Comment
Please, Sign In to add comment