Ahoj,
pokouším se dát dohromady jednoduchý program, v rámci kterého mám lodě, definované IDčkem, XY souřadnicemi a úhlem (úhel je jen kvůli budoucí funkcionalitě). Jedna z lodí je hráč, a zbytek lodí bych rád dostal do nějakého kontejneru seřazené podle toho, jak jsou daleko od hráče. Taky bych rád, aby výsledný program byl co nejrychlejší, na paměti nesejde.
V rámci jistého nadšení z kontejnerů a jmenovitě <map> jsem napsal program:
#include <iostream>
#include <map>
#include <ctime>
using namespace std;
struct Ship {
int id;
float x, y, a;
};
int main() {
srand(time(0)); // Cisteni random
Ship actor = {-1, 0.f, 0.f, 0.f}; // Lod hrace
map<float, Ship> drawpipe; // Asociativni pole, indexem je vzdalenost ke hraci
Ship *ships = new Ship[100]; // Pole lodi
for (int i = 0; i < 100; i++) { // Iniciace id, nahodnych souradnic, uhel zatim nic
ships[u].id = i+1;
ships[i].x = rand() % 1000 - 500.f;
ships[i].y = rand() % 1000 - 500.f;
ships[i].a = 0.f;
}
float dist; // Pomocna promenna pro vypocet vzdalenosti
for (int i = 0; i < 100; i++) {
dist = (ships[i].x - actor.x) * (ships[i].x - actor.x) + (ships[i].y - actor.y) * (ships[i].y - actor.y);
//drawpipe.push(dist, ships[i]); // Pridej objekt do pole na pozici danou vzdalenosti
}
for(auto &object, drawpipe) { // Pro vsechny prvky kontejneru drawpipe vypis, jak se budou vykreslovat
cout << "Object " << object.second.id << " at [" << object.second.x << ", " << object.second.y "] with distance " << object.first << endl;
}
return 0;
}
Nicméně pak mi došlo, že vlastně nevím, jak uložit do drawpipe objekty způsobem, se kterým s nimi chci pracovat. Online dokumentace mi moc nepomohla.
V podstatě mám 2 otázky:
- Vyplatí se použít na takovýto program kontejnery, nebo jsou zbytečně pomalé? Pokud se to vyplatí, který kontejner mám použít, resp. jak mám do map přidat objekty takovým způsobem, aby dva objekty se stejným klíčem byly za sebou a nepřepsaly se?
- Pokud se to nevyplatí, a já to budu programovat na nejnižší možné úrovni, co je rychlejší: vytvořit si pole struktur <objekt, vzdálenost> a aplikovat na něj mergesort (pochopitelně vylepšený o insert sort) nebo se patlat se spojovým seznamem (předpokládám, že tahle varianta určitě není nejrychlejší)
Co jsem se tak začetl, tak map je realizována binárním stromem, ale co se týče stromů, tak nejsem příliš zběhlý v jejich vyvažování. Navíc potřebuju, aby vytvoření pole bylo maximálně rychlé, jakákoli další práce s ním už bude jenom čtení (a to nikoliv náhodné, ale vždycky projet celé pole od začátku do konce).
Díky moc předem za všechny rady