2012-03-25 24 views
1

我正在使用圖像和計算對象的氡變換。其計算變換函數接受向量作爲輸入:將值賦給std :: vector <用戶定義>

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

像素是定義爲用戶定義的結構:

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

我不期待使用載體,所以任何幫助將不勝感激。
另外, 如果xCoordArray,yCoordArray可以計算爲向量,有沒有辦法加入他們,使每個向量索引作爲兩個值。

+1

你有沒有試過'segObj.reserve(element_count);''''''''''''''''vector'在插入過程中不會調整大小,'push_back'變成一個常量時間操作? – Naveen 2012-03-25 15:48:52

回答

2

您可以創建一個輸入迭代器,生成pixel對象並直接指定這些對象。你可以直接使用沿着此線的東西初始化對象:

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

這麼說,我有點懷疑,這確實是瓶頸:你分析代碼,或者是你懷疑,這是什麼問題?

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)

追加到容器的端部的新元素。該元素就地構建,即不執行復制或移動操作。提供給該函數的元素的構造函數與參數完全相同。

+0

感謝您的回覆。其實我已經在使用保留了,但是當像素數量> 2000時幾乎沒有什麼改進。我想刪除for循環,但是因爲每個索引都有兩個值(x,y),所以使用類似的函數並不簡單。assign() – user1291412 2012-03-25 16:03:15

+1

@ user1291412:即使你可以使用'assign',它仍然是'O(n)'操作。我懷疑這是否是您程序中的真正瓶頸。 – Naveen 2012-03-25 16:06:36

相關問題