我已经实现了一个对图像进行计算的类。正在对给定图像的子集(简称1000个中的100个)进行处理,并且每个图像需要不同的迭代次数才能完成。处理使用GPU,因此无法一次使用所有图像。当完成图像处理时,移除该图像并添加另一个图像。所以我使用了三个不同的向量image_outcome
,image_index
,image_operation
来保持图像的外观:
image_outcome
是std::vector<float>
,其每个元素都是一个值,用作决定图像何时完成的标准。image_index
是std::vector<int>
,用于保存原始数据集中的图像索引。image_operation
是std::vector<MyEnumValue>
,其中包含用于更新image_outcome
的操作。属于enum
类型,其值是许多可能的操作之一。还有两个功能,一个用于删除已完成的图像,另一个用于添加删除的图像(如果输入中仍有足够的图像)。
remove_images()
函数使用所有三个矩阵和图像矩阵,并使用std::vector.erase()
删除元素。add_images()
再次取三个矩阵,图像矩阵将新图像和相关信息添加到矢量中。因为我在具有相同索引的每个向量上使用erase()
(以及类似的添加方式),我想:
struct
(嵌套结构)。class
。代码的高级示例可以在下面提供资金:
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);
}
}
答案 0 :(得分:2)
我认为,用户定义的对象的单个向量可以更好地工作,而不是具有3个向量的结构。
std::vector<MyImage> images;
class MyImage {
Image OImage; // the actual image
float fOutcome;
int dIndex;
MyEnumValue eOperation;
bool getIsDone() {
return fOutcome > 0; // random condition
}
}
您可以使用条件
添加矢量或从矢量中删除if( (*it).getIsDone() ) {
VMyVector.erase( it );
}
在我看来,保持3个并行的向量很容易出错并且难以修改。