shushus

Спринт 7. Указатели и константность.

Jan 12th, 2023
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. enum class CatBreed {
  10.     Bengal,
  11.     Balinese,
  12.     Persian,
  13.     Siamese,
  14.     Siberian,
  15.     Sphynx,SuccessSuccess
  16. };
  17.  
  18. enum class Gender {
  19.     Male,
  20.     Female,
  21. };
  22.  
  23. struct Cat {
  24.     string name;
  25.     Gender gender;
  26.     CatBreed breed;
  27.     int age;
  28. };
  29.  
  30. string CatBreedToString(CatBreed breed) {
  31.     switch (breed) {
  32.         case CatBreed::Bengal:
  33.             return "Bengal"s;
  34.         case CatBreed::Balinese:
  35.             return "Balinese"s;
  36.         case CatBreed::Persian:
  37.             return "Persian"s;
  38.         case CatBreed::Siamese:
  39.             return "Siamese"s;
  40.         case CatBreed::Siberian:
  41.             return "Siberian";
  42.         case CatBreed::Sphynx:
  43.             return "Sphynx"s;
  44.         default:
  45.             throw invalid_argument("Invalid cat breed"s);
  46.     }
  47. }
  48.  
  49. ostream& operator<<(ostream& out, CatBreed breed) {
  50.     out << CatBreedToString(breed);
  51.     return out;
  52. }
  53.  
  54. ostream& operator<<(ostream& out, Gender gender) {
  55.     out << (gender == Gender::Male ? "male"s : "female"s);
  56.     return out;
  57. }
  58.  
  59. ostream& operator<<(ostream& out, const Cat& cat) {
  60.     out << '{' << cat.name << ", "s << cat.gender;
  61.     out << ", breed: "s << cat.breed << ", age:"s << cat.age << '}';
  62.     return out;
  63. }
  64.  
  65. template <typename Comparator>
  66. vector<const Cat*> GetSortedCats(const vector<Cat>& cats, const Comparator& comp) {
  67.     vector<const Cat*> sorted_cat_pointers;
  68.     for (const Cat& cat : cats) {
  69.         sorted_cat_pointers.push_back(&cat);
  70.     }
  71.     sort(sorted_cat_pointers.begin(), sorted_cat_pointers.end(), [comp](const Cat* lhs, const Cat* rhs) {
  72.         return comp(*lhs, *rhs);
  73.     });
  74.  
  75.     return sorted_cat_pointers;
  76. }
  77.  
  78. void PrintCatPointerValues(const vector<const Cat*>& cat_pointers, ostream& out) {
  79.     if (cat_pointers.empty()) {
  80.         out << "{}"s;
  81.     }else{
  82.         bool first = true;
  83.         out << "{"s;
  84.         for (const Cat* cat_poiner : cat_pointers) {
  85.             if(first){
  86.                 out << *cat_poiner;
  87.                 first = false;
  88.             } else{
  89.                 out<<", "s<<*cat_poiner;
  90.             }
  91.         }
  92.         out<<"}"s;
  93.     }
  94. }
  95.  
  96. int main() {
  97.     const vector<Cat> cats = {
  98.         {"Tom"s, Gender::Male, CatBreed::Bengal, 2},
  99.         {"Leo"s, Gender::Male, CatBreed::Siberian, 3},
  100.         {"Luna"s, Gender::Female, CatBreed::Siamese, 1},
  101.         {"Charlie"s, Gender::Male, CatBreed::Balinese, 7},
  102.         {"Ginger"s, Gender::Female, CatBreed::Sphynx, 5},
  103.         {"Tom"s, Gender::Male, CatBreed::Siamese, 2},
  104.     };
  105.  
  106.     {
  107.         auto sorted_cats = GetSortedCats(cats, [](const Cat& lhs, const Cat& rhs) {
  108.             return tie(lhs.breed, lhs.name) < tie(rhs.breed, rhs.name);
  109.         });
  110.  
  111.         cout << "Cats sorted by breed and name:"s << endl;
  112.         PrintCatPointerValues(sorted_cats, cout);
  113.         cout << endl;
  114.     }
  115.  
  116.     {
  117.         auto sorted_cats = GetSortedCats(cats, [](const Cat& lhs, const Cat& rhs) {
  118.             return tie(lhs.gender, lhs.breed) < tie(rhs.gender, rhs.breed);
  119.         });
  120.  
  121.         cout << "Cats sorted by gender and breed:"s << endl;
  122.         PrintCatPointerValues(sorted_cats, cout);
  123.         cout << endl;
  124.     }
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment