Untitled
unknown
plain_text
a year ago
3.6 kB
4
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