优先采用什么数据结构而不是操纵多个向量

时间:2016-08-22 12:06:29

标签: c++ vector data-structures stl

我已经实现了一个对图像进行计算的类。正在对给定图像的子集(简称1000个中的100个)进行处理,并且每个图像需要不同的迭代次数才能完成。处理使用GPU,因此无法一次使用所有图像。当完成图像处理时,移除该图像并添加另一个图像。所以我使用了三个不同的向量image_outcomeimage_indeximage_operation来保持图像的外观:

  1. image_outcomestd::vector<float>,其每个元素都是一个值,用作决定图像何时完成的标准。
  2. image_indexstd::vector<int>,用于保存原始数据集中的图像索引。
  3. image_operationstd::vector<MyEnumValue>,其中包含用于更新image_outcome的操作。属于enum类型,其值是许多可能的操作之一。
  4. 还有两个功能,一个用于删除已完成的图像,另一个用于添加删除的图像(如果输入中仍有足够的图像)。

    1. remove_images()函数使用所有三个矩阵和图像矩阵,并使用std::vector.erase()删除元素。
    2. add_images()再次取三个矩阵,图像矩阵将新图像和相关信息添加到矢量中。
    3. 因为我在具有相同索引的每个向量上使用erase()(以及类似的添加方式),我想:

      1. 使用具有三个向量的私有struct(嵌套结构)。
      2. 使用使用三个向量(嵌套类)实现的私有class
      3. 使用vec以外的其他数据结构。
      4. 代码的高级示例可以在下面提供资金:

        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);
          }
        }
        

1 个答案:

答案 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个并行的向量很容易出错并且难以修改。