向量分割错误向量

Posted

技术标签:

【中文标题】向量分割错误向量【英文标题】:Vector of Vector Segmentation Fault 【发布时间】:2018-03-29 18:45:46 【问题描述】:

当我尝试将值分配给这个向量向量时,我不断遇到分段错误。我基本上是从图像中读取像素,然后尝试创建一个向量向量,您可以访问该行,然后访问该行上的像素以获取该点的像素。但是当我尝试将特定像素分配给像素值时,它会给我一个分段错误。我使用 255,255,255 的占位符作为示例像素,但我计划使用 this->PIX[num_pix].r() 如果我可以让它工作,这基本上是我的 Image 类中的像素获取器,其中 num_pix 是迭代的当前像素。

vector<vector<Pixel>> Image::as_rows()
  vector<vector<Pixel>> pixels;
  int i,k,height, width,pix_num;
  pix_num=0;
  height = this->HDR.height();
  width = this->HDR.width();
  for(i=0;i<height;i++)
    for(k=0;k<width;k++)
       pix_num++;
       pixels[i][k] = 255,255,255;
    
  
  return pixels;

【问题讨论】:

您忘记事先调整矢量大小。访问向量的元素不会自动调整其大小以确保该元素存在。或者 push_back 可用的元素和向量。 你必须push_back 或construct 大小合适,你不能只是开始将数据粉碎成一个空向量。 【参考方案1】:

您的向量当前为空,这意味着当您尝试分配给您不拥有的内存(使用pixels[i][k] = 255, 255, 255)时,您将有未定义的行为。

您可以在声明向量时使用正确数量的对象对其进行初始化:

vector<vector<Pixel>> pixels(height, vector<Pixel>(width));

另外,对于未来,您可以使用.at() 代替下标运算符来强制边界检查并避免UB。

【讨论】:

【参考方案2】:

您尝试访问一个空向量,这是未定义的行为。您必须先分配元素,然后才能像您尝试做的那样通过索引访问它们。在开始时使用正确数量的对象初始化向量的另一种方法是 push_back 您需要的对象。使用 Pixel 对象的向量向量,您会想要填充这样的内容。

std::vector<std::vector <Pixel> > pixels;
for(i=0;i<height;i++)

    pixels.push_back(std::vector<Pixel>());
    for(k=0;k<width;k++)
    
        pix_num++;
        pixels[i].push_back(255,255,255);
    

【讨论】:

【参考方案3】:

您的问题是 pixels 是一个空向量。它的元素是vector&lt;Pixel&gt; - 但它没有任何元素。便宜又愉快的解决方案是先计算heightwidth,然后用足够的大小合适的元素构造pixels

    const int height = this->HDR.height();
    const int width  = this->HDR.width();
    std::vector<std::vector<Pixel>> pixels(height, width, 0,0,0);

但是,这将具有可怕的内存局部性属性。我强烈建议您编写一个 Bitmap 类,它将 x,y 映射到单个向量中的偏移量,并使用宽度和高度构造它。

【讨论】:

以上是关于向量分割错误向量的主要内容,如果未能解决你的问题,请参考以下文章

用索引向量保存分割顺序

在Swift中平均分割一个大向量[重复]

基于SVM支持向量机的彩色图像目标分割算法matlab仿真

支持向量机SVM

PCL基于法线的差异来分割点云

在不使用向量的情况下,将字符串分割成C ++中的数组