Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <cstdint>
  2. #include <vector>
  3. #include <optional>
  4. #include <algorithm>
  5. #include <memory>
  6.  
  7. struct Apartment {
  8.     uint32_t roomCount;
  9.     uint32_t area;
  10.     int32_t floor;
  11.     uint32_t districtId;
  12.     Apartment(uint32_t roomCount_, uint32_t area_, int32_t floor_, uint32_t districtId_)
  13.         : roomCount(roomCount_)
  14.         , area(area_)
  15.         , floor(floor_)
  16.         , districtId(districtId_) {}
  17. };
  18.  
  19. using Ta = std::shared_ptr<Apartment>;
  20.  
  21. // Контейнер для хранения
  22. std::vector<Ta> apartments{};
  23.  
  24. void addApartment(Ta ap) {
  25.     apartments.push_back(ap);
  26. }
  27.  
  28. template<typename TVal, typename F>
  29. void filterValues(std::optional<TVal> optVal, std::vector<Ta>& prev, F&& getVal) {
  30.     if(!optVal.has_value()) {
  31.         return;
  32.     }
  33.     auto value = optVal.value();
  34.     prev.erase(std::remove_if(prev.begin(),
  35.                               prev.end(),
  36.                               [getVal = std::move(getVal), value, valuet = static_cast<double>(value) / 10](const Ta& x) {
  37.                                   return std::fabs(static_cast<double>(getVal(x)) - value) > valuet;
  38.                               }),
  39.                prev.end());
  40. }
  41.  
  42. std::vector<Ta> findApartments(std::optional<uint32_t> districtId, std::optional<uint32_t> roomCount, std::optional<uint32_t> area, std::optional<int32_t> floor) {
  43.     std::vector<Ta> rv = apartments;
  44.     if(districtId.has_value()) {
  45.         rv.erase(std::remove_if(rv.begin(), rv.end(), [value = districtId.value()](const Ta& x){ return x->districtId != value; }),
  46.                  rv.end());;
  47.     }
  48.     filterValues(roomCount, rv, [](const Ta& item) { return item->roomCount; });
  49.     if(rv.empty()) {
  50.         return rv;
  51.     }
  52.     filterValues(area, rv, [](const Ta& item) { return item->area; });
  53.     if(rv.empty()) {
  54.         return rv;
  55.     }
  56.     filterValues(floor, rv, [](const Ta& item) { return item->floor; });
  57.     if(rv.empty()) {
  58.         return rv;
  59.     }
  60.     return rv;
  61. }
  62.  
  63. int main() {
  64.     addApartment(std::make_shared<Apartment>(89, 12, 1, 1));
  65.     addApartment(std::make_shared<Apartment>(91, 12, 1, 1));
  66.     addApartment(std::make_shared<Apartment>(100, 12, 1, 1));
  67.     addApartment(std::make_shared<Apartment>(101, 12, 1, 1));
  68.     addApartment(std::make_shared<Apartment>(110, 12, 1, 1));
  69.     addApartment(std::make_shared<Apartment>(111, 12, 1, 1));
  70.     auto res = findApartments(std::nullopt, 100, std::nullopt, std::nullopt);
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement