C++ 将值分配给std::vector
我正在处理图像并计算对象的radon变换。计算变换的函数接受向量作为输入:C++ 将值分配给std::vector,c++,c,C++,C,我正在处理图像并计算对象的radon变换。计算变换的函数接受向量作为输入: pixel p; vector<pixel> segObj //segObj is the object segmneted from the image 目前,我正在对向量进行元素赋值: for(int ix=0; ix < element_count; ix++) { f.x = xCoordArray[ix]; f.y = yCoordArray[ix]; segObj.push_back(f
pixel p;
vector<pixel> segObj //segObj is the object segmneted from the image
目前,我正在对向量进行元素赋值:
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循环使处理大型图像时速度变慢。有没有办法将xCoordArray和yCoordArray直接分配给vectorsegObj
我不熟悉矢量的使用,因此任何帮助都将不胜感激。
而且
如果xCoordArray、yCoordArray可以作为向量计算,那么有没有一种方法可以将它们连接起来,使每个向量索引都作为两个值 速度慢的一个原因是,在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);
}
注意,它调用,而不是向后推。此成员函数仅适用于C++11;它在适当的位置构造像素对象。添加到矢量时不复制像素对象:
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
}
模板<类。。。Args>
无效放置返回参数(&U)。。。args;自C++11以来
将新元素追加到容器的末尾。元素是就地构造的,即不执行复制或移动操作。调用元素的构造函数时使用的参数与提供给函数的参数完全相同
速度慢的一个原因是在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);
}
注意,它调用,而不是向后推。此成员函数仅适用于C++11;它在适当的位置构造像素对象。添加到矢量时不复制像素对象:
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
}
模板<类。。。Args>
无效放置返回参数(&U)。。。args;自C++11以来
将新元素追加到容器的末尾。元素是就地构造的,即不执行复制或移动操作。调用元素的构造函数时使用的参数与提供给函数的参数完全相同
您可以创建一个生成像素对象的输入迭代器,并直接分配这些对象。您可以使用以下方法直接初始化对象:
pixel iterator::operator*() const {
pixel rc = {
xCoordArray[index],
tCoordArray[index]
};
return rc;
}
也就是说,我有点怀疑这是否真的是瓶颈:您是分析了代码还是怀疑这是问题所在?您可以创建一个生成像素对象的输入迭代器并直接分配这些对象。您可以使用以下方法直接初始化对象:
pixel iterator::operator*() const {
pixel rc = {
xCoordArray[index],
tCoordArray[index]
};
return rc;
}
尽管如此,我还是有点怀疑这是否真的是瓶颈:您是否分析了您的代码,或者您是否怀疑这就是问题所在?您是否尝试过使用segObj.reservelement\u count;在forloop之前,使向量在插入过程中不调整大小,并使推回成为一个恒定时间操作?您是否尝试过使用segObj.reserveelement\u计数;在forloop之前,这样向量在插入过程中就不会调整大小,而推回操作就变成了一个固定时间操作?谢谢你的回复。实际上,我已经在使用reserve,但是当像素数>2000时,几乎没有什么改进。我想删除for循环,但由于每个索引都有两个值x,y,所以使用这样的函数并不简单。assign@user1291412:即使您可以使用“分配”,它仍将处于运行状态。我怀疑这是否是你计划中的真正瓶颈。谢谢你的回复。实际上,我已经在使用reserve,但是当像素数>2000时,几乎没有什么改进。我想删除for循环,但由于每个索引都有两个值x,y,所以使用这样的函数并不简单。assign@user1291412:即使您可以使用“分配”,它仍将处于运行状态。我怀疑这是否是你计划中的真正瓶颈。