Ich habe ein Performanceproblem bei meinem Hobbyprojekt. Wie schon unter der Rubrik QT-Programmierung genannt entwickel ich eine SImulation. Da die Frage hier nicht so ganz bei QT-Programmierung reinpasst, stelle ich sie hier:
In der folgenden Methode wird meine Spielwelt initialisiert. Das funktioniert bei einem Spielfeld von 100 x 100 einwandfrei. Die einzelnen Lebewesen sind schön ungleichmäßig über die ganze Karte verteilt. Sobalt es an 300 x 300 geht dauert die Initialisierung bereits eine Minute. Bei 600 x 600 habe ich nach 5 Minuten abgebochen...
Was brauche ich? Ich brauche eine Mölichkeit, wie ich einen Container der STL wahlfrei Initialisieren kann, also nicht von 0 bis n sonder ich möchte zufällige Positionen im Vektor ansteuern bis alle Felder initialisiert worden. Ich habe da schon ein wenig bei der STL (std::generade) geschaut aber keine wirklich gute Variante gefunden.
Nun hoffe ich, dass Euch eine Möglichkeit einfällt.
Code: Alles auswählen
void TWorldWator::_initializeWorld()
{
//Variablen
TIndividual *newIndividual = 0; //Fuer das Erstellen eines neuen Lebewesens
std::vector<std::pair<int, int> > positions;
TWorldSize worldSize;
long randomPos = 0;
//Hole Groesze der Spielwelt
worldSize = getWorldSize();
//Initialisiere Zufallszahlengenerator
srand(time(NULL));
//Initialisiere Vectoren
for (int z = 0; z < worldSize.second; z++) //Zeilen
{
for (int s = 0; s < worldSize.second; s++) //Spalten
{
positions.push_back(std::pair<int, int>(z, s));
}//end for
}//end for Zeilen
//Wiederhole bis alle Positionen vergeben
while(positions.size() > 0)
{
//Generiere Zufallszahl für Position
randomPos = rand() % positions.size();
//Erstelle neues Individuum
newIndividual = _createRandomIndividual();
//Setze neues Individuum auf Spielfeld
_setPlayingFieldValue(positions.at(randomPos).first,
positions.at(randomPos).second,
*newIndividual);
//Entferne die gerade genutzten Positionen aus den Vectoren
//Suche Iterator zum Wert
std::vector<std::pair<int, int> >::iterator pIt = std::find(positions.begin(),
positions.end(),
positions.at(randomPos));
//Entferne Element aus dem Vector
positions.erase(pIt);
}//end while
}//end initilizeWorld
Das eigentliche und langse Problem im Code ist dieses hier:
Code: Alles auswählen
//Entferne die gerade genutzten Positionen aus den Vectoren
//Suche Iterator zum Wert
std::vector<std::pair<int, int> >::iterator pIt = std::find(positions.begin(),
positions.end(),
positions.at(randomPos));
//Entferne Element aus dem Vector
positions.erase(pIt);
Grüße
MaX