Permalänk
Medlem

C++ fråga om queues

Jag har en hel radda med queues som ska representera köer i ett snabbköp. Varje minut läggs det till ett slumpvist antal kunder och dessa kunder ska in i den queue som är kortast. Jag har gjort en rutin där jag matar ut varje queues antal till integers. Sedan körs det en jämförelse mellan varje integer för att hitta det minsta nummret. Dock så säger ju inte nummret vilket queue detta tillhör. Hur tar jag enklast reda på detta och matar in det nya antalet kunder där?
Ska jag använda pointers eller är jag helt fel ute?

Permalänk
Medlem

Re: C++ fråga om queues

Citat:

Ursprungligen inskrivet av Tallrot
Jag har en hel radda med queues som ska representera köer i ett snabbköp. Varje minut läggs det till ett slumpvist antal kunder och dessa kunder ska in i den queue som är kortast. Jag har gjort en rutin där jag matar ut varje queues antal till integers. Sedan körs det en jämförelse mellan varje integer för att hitta det minsta nummret. Dock så säger ju inte nummret vilket queue detta tillhör. Hur tar jag enklast reda på detta och matar in det nya antalet kunder där?
Ska jag använda pointers eller är jag helt fel ute?

Det beror lite på hur du håller reda på köerna. Har du en indexerbar behållare är det nog enklast att bara hålla reda på index till kortaste kön.

int get_index_of_shortest_queue(vector<queue_type> queues) { if (queues.empty()) return -1; int shortest_index = 0; for (int i = 1; i < queues.size(); i++) if (queues[i].size() < queues[shortest_index].size()) shortest_index = i; return shortest_index; }

I annat fall kan du hålla en pekare eller iterator till kortaste kön. Pseudokod:

queue_type* shortest_queue = &queues[0]; for each queue in queues if (queue.size() < shortest_queue->size()) shortest_queue = &queue;

Edit: Efter att ha funderat lite tycker jag att det kanske är enklast att returnera en pekare istället för index.

queue_type* get_shortest_queue(vector<queue_type> queues) { if (queues.empty()) return NULL; queue_type* shortest_queue = &queues[0]; for (int i = 1; i < queues.size(); i++) if (queues[i].size() < shortest_queue->size()) shortest_queue = &queues[i]; return shortest_queue; } queue_type* shortest_queue = get_shortest_queue(queues); if (shortest_queue) shortest_queue->push(new_customer); else no_queues_available();

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Jag försöker få in det där sista kodstycket i min kod men hur anpassar jag den till namnen på mina queues? De heter ko1, ko2 osv ända till ko7

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Tallrot
Jag försöker få in det där sista kodstycket i min kod men hur anpassar jag den till namnen på mina queues? De heter ko1, ko2 osv ända till ko7

Det enklaste, och det jag rekommenderar, är ju såklart om du lägger dina köer i en container. Då blir det även mycket lättare att ha ett dynamiskt antal köer.

Vi antar att din kod i nuläget ser ut som

queue<Kund> ko1, ko2, ko3, ko4, ko5, ko6, ko7;

Du kan då istället skapa köerna som (jag skriver klass- och variabelnamn på engelska, men du kan fortsätta med svenska om du vill; engelska är dock de facto-språk inom programmering)

int number_of_queues = 7; vector<queue<Customer> > queues; for (int i = 0; i < number_of_queues; i++) queues.push_back(queue<Customer>()); ... queue<Customer>* shortest_queue = get_shortest_queue(queues);

Du kommer åt dina köer genom queues[0], queues[1], o.s.v. Det är dock inte säkert att du verkligen behöver komma åt specifika köer på det sättet. I de funktioner jag postade behövs det inte, då allt sker genom ett godtyckligt index i (queues[i]).

Vill du av någon anledning inte byta ut ditt nuvarande system kan det vara enklast att helt enkelt skriva ut allt manuellt som nedan. Det går att skapa mappningar mellan tal och kö så att du, om du redan har kod för att hitta lägsta talet, kan få fram vilken kö det handlar om, men det är mer komplicerat.

queue<Kund>* kortast_ko = &ko1; if (ko2.size() < kortast_ko->size()) kortast_ko = &ko2; if (ko3.size() < kortast_ko->size()) kortast_ko = &ko3; ...

Visa signatur

Vill du ha svar? Citera mig gärna.