Andy_rst ,
зделал массив булевый у каждого стола...
если за него отвечает официант, он добавляет в массив булевую свою.
и записывает в ассоциативный массив адресс -
Код:
class UWaiter //класс официант
{
...
TMap<int32,int32> ServiceBollAdress //tableID , boolID
...
}
///////////////////////////
class UTable
{
void DrinkBeer() {};//
TArray<bool> bNeedBeerTables; //по сути это - кеш булевых из официантов
};
////////////////////////////
//булевые из официанта в столы
//где в метод вставить это кусок для инициализации
// и аналогичным способов обновлять булевые значения уже в каком-то друго методе
for (int i = 0; i < Waiter.Num(); i++) //задаем булевые массивы в столах и записываем адреса
{
for (int j = 0; j < Waiter[j]->HereTableCachedID.Num(); j++)
{
//boolID
int32 d =Tables[Waiter[j]->HereTableCachedI[j]].bNeedBeerTables.Add(bNeedBeer[Waiter[j]->HereTableCachedI[j]]);
ServiceBollAdress.Add(Waiter[j]->HereTableCachedI[j], d); //add to TMap
}
}
////////////
...
void CafeRun()
{
for (int j = 0; j < Waiter.Num(); j++)//цикл официантов
{
for (int i = 0; i < Waiter[j]->HereTableCachedID.Num(); i++) //цикл обслуживаемых столов у официанта
{
//проверяем нужно ли нести на стол пиво
//содержит ли булевый массив true
//это должно быть быстро по идее
if (Tables[Waiter[j]->HereTableCachedID].bNeedBeerTables.Contains(true))
{
Waiter[j]->SetBeer(Tables[Waiter[j]->HereTableCachedID]);//несем пиво
}
}
}
TablesDrinkBeer(); //столы выпивают пиво
}
немного грязно именно в такой записи потому что айди столов и ключи ассоциативного массива булевых адресов дублируется
поэтому их нужно обьединить в одну переменную.
проверка булевого массива содержит ли он true - если зависит от размера массива,
тогда проверка столов с одним официантом будет мгновенная, а с большим кол-вом официантов пропорциональна их количству на данный стол.
так что я думаю что это неплохой способ.
по сути это официант выставляет и убирает таблички на стол "свободная касса!", и запоминает какя из табличек его.
если на столе есть хоть одна табличка значит стол обслуживается.
можно наоброт в столы записывать адреса булевых в официантах... и читать булевые прямо из официантов.
но тогда становится неудобная проверка в цикле хоть и по прямым адресам, не будет мозможности для быстрой .Contains(true)
естественно в оригинальная задача не связанна с кафе... поток данных просто аналогичный.
_________________
we need to go deeperПоследний раз редактировалось
Snake 22 янв 2018, 13:29, всего редактировалось 8 раз(а).