Ich habe eine Klasse implementiert, die Berechnungen auf Bildern durchführt. Die Verarbeitung wird an einer Teilmenge der gegebenen Bilder (z. B. 100 von 1000) gleichzeitig durchgeführt, und jedes Bild benötigt eine andere Anzahl von Wiederholungen, um es zu beenden. Die Verarbeitung verwendet GPUs und daher ist es nicht möglich, alle Bilder gleichzeitig zu verwenden. Wenn die Verarbeitung eines Bildes beendet ist, wird dieses Bild entfernt und ein weiteres hinzugefügt. Ich bin also mit drei verschiedenen Vektoren image_outcome
, image_index
, image_operation
infromations über die Bilder zu behalten:Welche Datenstruktur wird bevorzugt, anstatt mehrere Vektoren zu manipulieren
- Die
image_outcome
einstd::vector<float>
ist und jedes seiner Elemente ist ein Wert, der als Kriterium verwendet wird, um zu entscheiden, wenn das Bild fertig. Dieimage_index
ist einestd::vector<int>
, die den Index des Bildes im ursprünglichen Dataset enthält. - Die
image_operation
ist einestd::vector<MyEnumValue>
, die den Vorgang enthält, der zum Aktualisieren derimage_outcome
verwendet wird. Ist einenum
Typ und sein Wert ist einer von vielen möglichen Operationen.
Es gibt auch zwei Funktionen, eine, um die fertigen Bilder zu entfernen und eine, um so viele Bilder hinzuzufügen wie entfernt (wenn noch genug in der Eingabe vorhanden ist).
remove_images()
Die Funktion nimmt alle drei Matrizen und die Bildmatrix und entfernt die Elemente, die diestd::vector.erase()
verwenden.- Die
add_images()
nimmt wieder die drei Matrizen und die Bildmatrix fügt den Vektoren neue Bilder und die relevanten Informationen hinzu.
Weil ich eine erase()
auf jeden Vektor mit dem gleichen Index verwende (und auch eine ähnliche Art und Weise hinzuzufügen) Ich dachte an:
- Verwenden Sie eine privates
struct
, die drei Vektoren (verschachtelte Struktur hat). - Verwenden Sie eine private
class
, die mit drei Vektoren (verschachtelte Klasse) implementiert wird. - Verwenden Sie eine andere Datenstruktur als vec.
A Höhe Ebene Beispiel des Codes Fonds unten sein:
class ComputationClass {
public:
// the constructor initializes the member variables
ComputationClass();
void computation_algorithm(std::vector<cv::Mat> images);
private:
// member variables which define the algorithms parameters
// add_images() and remove_images() functions take more than these
// arguments, but I only show the relevant here
add_images(std::vector<float>&, std::vector<int>&, std::vector<MyEnumValue>&);
remove_images(std::vector<float>&, std::vector<int>&, std::vector<MyEnumValue>&);
};
void ComputationClass::computation_algorithm(std::vector<cv::Mat> images) {
std::vector<float> image_output;
std::vector<int> image_index;
std::vector<MyEnumValue> image_operation;
add_images(image_output, image_index, image_operation);
while (there_are_still_images_to_process) {
// make computations by updating the image_output vector
// check which images finished computing
remove_images(image_output, image_index, image_operation);
add_images(image_output, image_index, image_operation);
}
}
Eine Struktur mit einem 'float', einem' int' und einem 'MyEnumValue', dann ein Vektor dieser Struktur? –
Daten, die miteinander verknüpft sind, sollten zusammen bleiben, oder Sie werden es schwer haben, sie zu verwalten. Es wird auch Cache-Misses reduzieren. – StoryTeller