#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;



void variant_1(){
   //Тупой вариант
   //Если массив структур "покупатель" не имеет дубликатов и нужно просто отсортировать массив, а общую стоимость покупок нужно глобальную выдавать


   struct pokupatel{
      string famulia,imya,nomer_carti,naimenovanie;
      int stoimost;
   };

   pokupatel massiv[]={    //Заданный масив структур покупатель
                           {"Filatov","Andrey","3123-5235-6322-6232","Petrushka",20},
                           {"Mihailov","Sergey","6236-2355-2366-6344","Ukrop",30},
                           {"Mihailov","Sergey","6236-2355-2366-6344","Moloko",90},
                           {"Mihailova","Elena","9999-8888-7777-5555","Spichki",3},
                           {"Mihailova","Sveta","9999-8888-7777-6666","godnaya petrushka",9000},
                      };

   //--------------------------------------


   //Отсортирую в порядке увеличения стоимости отдельной покупки (на всякий случай)
   std::sort(&massiv[0],&massiv[sizeof(massiv)/sizeof(*massiv)],[](pokupatel& a,pokupatel& b){return a.stoimost<b.stoimost;});


   //Выведу эту штуку
   cout<<" Svedeniya o pokupkah:\n\
 Imya       Familia    Karta                  Cena    Nazvanie                 Obshaya cena\n\
 -----------------------------------------------------------------------\n";
         int o=0;
   for (auto a:massiv){
      printf(" %-10s %-10s %-18s |  %-5d   %-20s  |  %-5d\n",a.imya.c_str(),a.famulia.c_str(),a.nomer_carti.c_str(),a.stoimost,a.naimenovanie.c_str(),(o+=a.stoimost));
   }
}



void variant_2(){
   //Умный вариант
   //Если массив структур "покупатель" имеет дубликаты, и нужно из них собрать массив покупателей


   struct pokupatel{
      string famulia,imya,nomer_carti,naimenovanie;
      int stoimost;
   };

   pokupatel massiv[]={    //Заданный масив структур покупатель
                           {"Filatov","Andrey","3123-5235-6322-6232","Petrushka",20},  // |
                           {"Mihailov","Sergey","7543-3457-2535-2321","Ukrop",30},     // | - эти ребята какую-то дичь купили
                           {"Mihailov","Sergey","7543-3457-2535-2321","Moloko",90},    // |
                           {"Mihailova","Elena","6236-2355-2366-6344","Moloko",90},  //Елена купила кучу спичек и молоко
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Elena","6236-2355-2366-6344","Spichki",3},
                           {"Mihailova","Sveta","9999-8888-7777-5555","Petrushka",20}, //Света купила кучу петрушки и спички
                           {"Mihailova","Sveta","9999-8888-7777-5555","Petrushka",20},
                           {"Mihailova","Sveta","9999-8888-7777-5555","Petrushka",20},
                           {"Mihailova","Sveta","9999-8888-7777-5555","Petrushka",20},
                           {"Mihailova","Sveta","9999-8888-7777-5555","Petrushka",20},
                           {"Mihailova","Sveta","9999-8888-7777-5555","Spichki",3},
                      };

   //--------------------------------------

   std::unordered_map<string,int> bb;
   for (auto a:massiv) if (auto m = bb.emplace(a.nomer_carti+" "+a.imya+" "+a.famulia,a.stoimost);!m.second) (*m.first).second+=a.stoimost;
   using pp=std::pair<string,int>;
   std::vector<pp> arr{bb.begin(),bb.end()};
   std::sort(arr.begin(),arr.end(),[](auto& a, auto& b){return a.second<b.second; });
   for (auto a:arr)
     printf(" %-37s : %-5d\n",a.first.c_str(),a.second);

}


int main(){

   variant_2();
  // variant_1();
   return 0;

}
