Untitled
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