Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdint>
- #include <vector>
- #include <optional>
- #include <algorithm>
- #include <memory>
- struct Apartment {
- uint32_t roomCount;
- uint32_t area;
- int32_t floor;
- uint32_t districtId;
- Apartment(uint32_t roomCount_, uint32_t area_, int32_t floor_, uint32_t districtId_)
- : roomCount(roomCount_)
- , area(area_)
- , floor(floor_)
- , districtId(districtId_) {}
- };
- using Ta = std::shared_ptr<Apartment>;
- // Контейнер для хранения
- std::vector<Ta> apartments{};
- void addApartment(Ta ap) {
- apartments.push_back(ap);
- }
- template<typename TVal, typename F>
- void filterValues(std::optional<TVal> optVal, std::vector<Ta>& prev, F&& getVal) {
- if(!optVal.has_value()) {
- return;
- }
- auto value = optVal.value();
- prev.erase(std::remove_if(prev.begin(),
- prev.end(),
- [getVal = std::move(getVal), value, valuet = static_cast<double>(value) / 10](const Ta& x) {
- return std::fabs(static_cast<double>(getVal(x)) - value) > valuet;
- }),
- prev.end());
- }
- std::vector<Ta> findApartments(std::optional<uint32_t> districtId, std::optional<uint32_t> roomCount, std::optional<uint32_t> area, std::optional<int32_t> floor) {
- std::vector<Ta> rv = apartments;
- if(districtId.has_value()) {
- rv.erase(std::remove_if(rv.begin(), rv.end(), [value = districtId.value()](const Ta& x){ return x->districtId != value; }),
- rv.end());;
- }
- filterValues(roomCount, rv, [](const Ta& item) { return item->roomCount; });
- if(rv.empty()) {
- return rv;
- }
- filterValues(area, rv, [](const Ta& item) { return item->area; });
- if(rv.empty()) {
- return rv;
- }
- filterValues(floor, rv, [](const Ta& item) { return item->floor; });
- if(rv.empty()) {
- return rv;
- }
- return rv;
- }
- int main() {
- addApartment(std::make_shared<Apartment>(89, 12, 1, 1));
- addApartment(std::make_shared<Apartment>(91, 12, 1, 1));
- addApartment(std::make_shared<Apartment>(100, 12, 1, 1));
- addApartment(std::make_shared<Apartment>(101, 12, 1, 1));
- addApartment(std::make_shared<Apartment>(110, 12, 1, 1));
- addApartment(std::make_shared<Apartment>(111, 12, 1, 1));
- auto res = findApartments(std::nullopt, 100, std::nullopt, std::nullopt);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement