Advertisement
Alex_St

immediately invoked lambda expression

Apr 26th, 2024
614
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.73 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <functional>
  4. #include <map>
  5. #include <unordered_map>
  6. #include <numeric>
  7. #include <set>
  8. #include <string>
  9. #include <vector>
  10.  
  11.  
  12. using namespace std;
  13.  
  14.  
  15. struct Person {
  16.     string name;
  17.     int age, income;
  18.     bool is_male;
  19. };
  20.  
  21.  
  22. struct PreCalculatedInfo
  23. {
  24.  
  25.     std::vector<int> age_set;
  26.     std::vector<int> wealth_set;
  27.  
  28.     std::vector<int> wealth_precalculated;
  29.     std::vector<int> age_precalculated;
  30.  
  31.     std::unordered_map<std::string_view, int> women_names;
  32.     std::unordered_map<std::string_view, int> men_names;
  33.  
  34.    
  35.     std::string popular_man_name;
  36.     std::string popular_woman_name;
  37. };
  38.  
  39.  
  40. const PreCalculatedInfo Precalculate(std::vector<Person> people)
  41. {
  42.     PreCalculatedInfo result;
  43.  
  44.     int popular_woman_name_counter = 0;
  45.     int popular_man_name_counter = 0;
  46.  
  47.     //запоминаем самых популярных людей мужского и женского пола
  48.     for(const auto& it : people)
  49.     {
  50.         result.wealth_set.push_back(it.income);
  51.         result.age_set.push_back(it.age);
  52.  
  53.         // (it.is_male) ? result.men_names[it.name]++ : result.women_names[it.name]++;
  54.         if(it.is_male)
  55.         {
  56.             result.men_names[it.name]++;
  57.  
  58.             if(result.men_names[it.name] > popular_man_name_counter)
  59.             {
  60.                 popular_man_name_counter++;
  61.                 result.popular_man_name = it.name;
  62.             }
  63.         }
  64.         else
  65.         {
  66.             result.women_names[it.name]++;
  67.  
  68.             if(result.women_names[it.name] > popular_woman_name_counter)
  69.             {
  70.                 popular_woman_name_counter++;
  71.                 result.popular_woman_name = it.name;
  72.             }
  73.         }
  74.     }
  75.    
  76.     //упорядочиваем векторы по возрастанию для age и убыванию для wealth
  77.     std::sort(result.age_set.begin(), result.age_set.end());
  78.     std::sort(result.wealth_set.begin(), result.wealth_set.end(), [](const int& lhs, const int& rhs){return lhs >= rhs;});
  79.  
  80.     //вычисляем значения богатства для запроса WEALTH
  81.     result.wealth_precalculated.reserve(result.wealth_set.size()+1);
  82.     result.wealth_precalculated[0] = 0;
  83.     size_t counter = 1;
  84.     for(const auto& it : result.wealth_set)
  85.     {
  86.         result.wealth_precalculated[counter] = result.wealth_precalculated[counter-1] + it;
  87.         counter++;
  88.     }
  89.    
  90.     //вычисляем значения совершеннолетних для запроса AGE
  91.     size_t max_age = result.age_set[result.age_set.size()-1];
  92.     result.age_precalculated.reserve(max_age+1);
  93.     for(size_t i = 0; i <= max_age; i++ )
  94.     {
  95.         auto adult_begin = lower_bound(result.age_set.begin(), result.age_set.end(), i);
  96.         result.age_precalculated[i] = distance(adult_begin, result.age_set.end());
  97.     }
  98.  
  99.     return result;
  100. }
  101.  
  102.  
  103. const vector<Person> ReadPeople(istream& input) {
  104.     int count;
  105.     input >> count;
  106.  
  107.     vector<Person> result(count);
  108.     for (Person& p : result) {
  109.         char gender;
  110.         input >> p.name >> p.age >> p.income >> gender;
  111.         p.is_male = gender == 'M';
  112.     }
  113.  
  114.     return result;
  115. }
  116.  
  117. int main()
  118. {
  119.    
  120.     //вызов через функцию
  121.     //const PreCalculatedInfo pre_calc_info = Precalculate(ReadPeople(cin));
  122.    
  123.     const vector<Person> people = ReadPeople(cin);
  124.     //вызов через лямбду
  125.     const PreCalculatedInfo pre_calc_info = std::invoke([&people]{
  126.             PreCalculatedInfo result;
  127.  
  128.             int popular_woman_name_counter = 0;
  129.             int popular_man_name_counter = 0;
  130.  
  131.             //запоминаем самых популярных людей мужского и женского пола
  132.             for(const auto& it : people)
  133.             {
  134.                 result.wealth_set.push_back(it.income);
  135.                 result.age_set.push_back(it.age);
  136.  
  137.                 // (it.is_male) ? result.men_names[it.name]++ : result.women_names[it.name]++;
  138.                 if(it.is_male)
  139.                 {
  140.                     result.men_names[it.name]++;
  141.  
  142.                     if(result.men_names[it.name] > popular_man_name_counter)
  143.                     {
  144.                         popular_man_name_counter++;
  145.                         result.popular_man_name = it.name;
  146.                     }
  147.                 }
  148.                 else
  149.                 {
  150.                     result.women_names[it.name]++;
  151.  
  152.                     if(result.women_names[it.name] > popular_woman_name_counter)
  153.                     {
  154.                         popular_woman_name_counter++;
  155.                         result.popular_woman_name = it.name;
  156.                     }
  157.                 }
  158.             }
  159.            
  160.             //упорядочиваем векторы по возрастанию для age и убыванию для wealth
  161.             std::sort(result.age_set.begin(), result.age_set.end());
  162.             std::sort(result.wealth_set.begin(), result.wealth_set.end(), [](const int& lhs, const int& rhs){return lhs >= rhs;});
  163.  
  164.             //вычисляем значения богатства для запроса WEALTH
  165.             result.wealth_precalculated.reserve(result.wealth_set.size()+1);
  166.             result.wealth_precalculated[0] = 0;
  167.             size_t counter = 1;
  168.             for(const auto& it : result.wealth_set)
  169.             {
  170.                 result.wealth_precalculated[counter] = result.wealth_precalculated[counter-1] + it;
  171.                 counter++;
  172.             }
  173.            
  174.             //вычисляем значения совершеннолетних для запроса AGE
  175.             size_t max_age = result.age_set[result.age_set.size()-1];
  176.             result.age_precalculated.reserve(max_age+1);
  177.             for(size_t i = 0; i <= max_age; i++ )
  178.             {
  179.                 auto adult_begin = lower_bound(result.age_set.begin(), result.age_set.end(), i);
  180.                 result.age_precalculated[i] = distance(adult_begin, result.age_set.end());
  181.             }
  182.  
  183.             return result;
  184.  
  185.     });
  186.    
  187.     for (string command; cin >> command;)
  188.     {
  189.         if (command == "AGE"s)
  190.         {
  191.             int adult_age;
  192.             cin >> adult_age;
  193.  
  194.             //auto adult_begin = lower_bound(pre_calc_info.age_set.begin(), pre_calc_info.age_set.end(), adult_age);
  195.  
  196.             cout << "There are "s << pre_calc_info.age_precalculated[adult_age] << " adult people for maturity age "s
  197.                  << adult_age << '\n';
  198.         }
  199.         else if (command == "WEALTHY"s)
  200.         {
  201.             int count;
  202.             cin >> count;
  203.             cout << "Top-"s << count << " people have total income "s << pre_calc_info.wealth_precalculated[count] << '\n';
  204.         }
  205.         else if (command == "POPULAR_NAME"s)
  206.         {
  207.             char gender;
  208.             cin >> gender;
  209.  
  210.             if(gender == 'M' && pre_calc_info.men_names.size() == 0)
  211.             {
  212.                 cout << "No people of gender "s << gender << '\n';
  213.             }
  214.             else if (gender == 'M' && pre_calc_info.men_names.size() > 0)
  215.             {
  216.                 cout << "Most popular name among people of gender "s << gender << " is "s << pre_calc_info.popular_man_name << '\n';
  217.             }
  218.             else if(gender == 'W' && pre_calc_info.women_names.size() == 0)
  219.             {
  220.                 cout << "No people of gender "s << gender << '\n';
  221.             }
  222.             else if(gender == 'W' && pre_calc_info.women_names.size() > 0)
  223.             {
  224.                 cout << "Most popular name among people of gender "s << gender << " is "s << pre_calc_info.popular_woman_name << '\n';
  225.             }
  226.          
  227.         }
  228.     }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement