将值分配给std :: vector <user-defined> </user-defined>

时间:2012-03-25 15:45:49

标签: c++ c

我正在处理图像和计算对象的氡变换。计算变换的函数接受向量作为输入:

pixel p;
vector<pixel> segObj  //segObj is the object segmneted from the image

pixel是用户定义的结构,定义为:

struct pixel
{
float x, y;  //x,y coordinates of the pixel
};

目前,我正在对向量进行元素明智的分配:

for(int ix=0; ix < element_count; ix++)
{
f.x = xCoordArray[ix];
f.y = yCoordArray[ix];
segObj.push_back(f);
//xCoordArray and yCoordArray are computed separately
}

for循环在处理大图像时会变慢。有没有办法直接将xCoordArrayyCoordArray分配给vector<pixel>segObj

我没有使用载体,所以任何帮助都会受到赞赏 也, 如果xCoordArrayyCoordArray可以计算为向量,是否有一种方法可以将它们连接起来,以便每个向量索引为两个值。

2 个答案:

答案 0 :(得分:3)

缓慢的一个原因是在for循环执行时由向量完成的重新分配(和复制)。在您的情况下,您可以这样做:

segObj.reserve(element_count); //DO THIS

for(int ix=0; ix < element_count; ix++)
{
  f.x = xCoordArray[ix];
  f.y = yCoordArray[ix];
  segObj.push_back(f);
}

这至少会改进代码,因为在循环之前有一个分配,并且在执行for循环时不会重新分配和复制。

如果你的编译器支持C ++ 11,那么你可以试试这个:

struct pixel
{
  float x,y;
  pixel(float x, float y) : x(x), y(y) {}   //add this constructor
};

segObj.reserve(element_count); //DO THIS

for(int ix=0; ix < element_count; ix++)
{
  segObj.emplace_back(xCoordArray[ix], yCoordArray[ix]);
}

请注意,它会调用emplace_back,而不是push_back。该成员函数仅适用于C ++ 11;它就地构造像素对象。添加到矢量时,不会复制像素对象:

  

template< class... Args >
  void emplace_back( Args&&... args ); (since C++11)

     

将新元素追加到容器的末尾。该元素就地构建,即不执行复制或移动操作。使用与提供给函数的完全相同的参数调用元素的构造函数。

答案 1 :(得分:2)

您可以创建一个输入迭代器来生成pixel个对象并直接分配它们。您可以使用以下内容直接初始化对象:

pixel iterator::operator*() const {
    pixel rc = {
        xCoordArray[index],
        tCoordArray[index]
    };
    return rc;
}

那就是说,我有点怀疑这确实是瓶颈:您是否对您的代码进行了分析,或者您是否怀疑这是问题?