Untitled

 avatar
unknown
plain_text
5 months ago
3.6 kB
3
Indexable
Вот обновленный код для `data.cpp`, с учетом предложенного изменения структуры хранения данных.

### Новый `data.cpp`
```cpp
#include "Data/data.h"

Data::Data() {
    for (auto& ptr : data_) {
        ptr = nullptr; // Инициализируем массив пустыми указателями
    }
}

void Data::addRail(const RailType& rt, const double& price, const uint64_t& num) {
    size_t index = static_cast<size_t>(rt);

    // Если указатель на RailMap для данного RailType отсутствует, создаем его
    if (!data_[index]) {
        data_[index] = std::make_unique<RailMap>();
    }

    // Добавляем или обновляем количество для указанной цены
    (*data_[index])[price] += num;
}

void Data::addRails(const std::unordered_map<RailType, RailMap>& rails) {
    for (const auto& [rt, railMap] : rails) {
        for (const auto& [price, num] : railMap) {
            this->addRail(rt, price, num);
        }
    }
}

RailMap& Data::operator[](const RailType& rt) const {
    size_t index = static_cast<size_t>(rt);

    // Проверяем, существует ли RailMap для данного RailType
    if (data_[index]) {
        return *data_[index];
    }

    throw std::invalid_argument("Has no rail of type: " + railTypeToString(rt));
}

double Data::getCheapestRail(const RailType& rt) {
    size_t index = static_cast<size_t>(rt);

    if (data_[index]) {
        for (auto& [price, num] : *data_[index]) {
            if (num > 0u) {
                num -= 1u; // Уменьшаем количество рельсов по минимальной цене
                return price;
            }
        }
    }

    throw std::invalid_argument("Doesn't have rails of type: " + railTypeToString(rt));
}

bool containsElements(const Data& data, const std::unordered_map<RailType, uint64_t>& order) {
    for (const auto& [rt, count] : order) {
        size_t index = static_cast<size_t>(rt);

        if (!data.data_[index]) {
            return false;
        }

        uint64_t total = 0u;
        for (const auto& [_, num] : *data.data_[index]) {
            total += num;
            if (total >= count) {
                break;
            }
        }

        if (total < count) {
            return false;
        }
    }
    return true;
}
```

### Основные изменения:
1. **Инициализация массива в конструкторе**:
   Все элементы массива инициализируются как `nullptr`, чтобы занимать минимальное количество памяти.
2. **Обращение по индексу**:
   Используется преобразование `RailType` в `size_t` для доступа к соответствующему элементу массива.
3. **Добавление рельсов**:
   Если указатель для текущего `RailType` равен `nullptr`, создается новый `unordered_map`.
4. **Исключение для отсутствующих данных**:
   При попытке доступа к несуществующему `RailMap` или недостаточному количеству рельсов выбрасывается исключение.

Если всё понятно, можно переходить к следующему этапу, если требуется.
Editor is loading...
Leave a Comment