2014-02-16 148 views
2

的所有元素的一個子元素添加恆定在四處尋找後,計算器,我發現這個優雅的解決方案到的std ::矢量

transform(myvec.begin(), myvec.end(), myvec.begin(), 
      bind2nd(std::plus<double>(), 1.0)); 

添加一個常數一個std中的所有元素::包含雙打的向量。 現在,我與關鍵點(OpenCV的關鍵點)我有一個std::vector<cv::keypoints>

這些關鍵點包含很多元素,如鉑(在X,Y的位置),大小,角度等等 工作,我想添加一個常數所有的Pt這反過來也包含兩個其他paramters(x和y)

我試圖做

std::transform(keypoints1.pt.x.begin(), keypoints1.pt.x.end(), 
       keypoints1.pt.x.begin(), std::bind2nd(std::plus<double>(), myconstantX)); 

但是,這並不編譯。不幸的是,我對STL結構的複雜訪問不太舒服。

你知道如何在不使用for循環的情況下做到這一點嗎?

感謝

回答

0

如果你想就地申請的修改,這是更好地爲你使用std::for_each而非std::transform,作爲改造的目的是存儲在另一個應用到集合的操作的結果採集。

至於用什麼應用,如果你使用C++ 11,最簡單的方法是使用這個lambda函數:

std::for_each(keypoints1.begin(), keypoints1.end(), [](cv::keypoint& k) { 
    k.pt.x += 1.0; 
}); 

然而,這是不是從根本上不同的for循環。詳情請參閱this question

2

在C++ 11,你可以使用一個通用的foreach循環是這樣做的:

for (auto& pt : keypoints) { 
    pt.x += myconstantX; 
} 

這比你的版本std::transform打字遠遠不足,而且更容易理解,同樣有效。

+0

假設我發現這比'for_each'和/或'std :: transform'版本(我這樣做)更容易閱讀。有什麼情況下我仍然想使用'for_each'或'std :: transform'? – Nemo

+0

@Nemo:我相信我們可以發明一些STL算法可能更好的情況。但是我沒有立即想到,所以或許我們可以同意KISS,並且有朝一日能夠看到STL的東西,如果我們真的不能用簡單的方法。 –

0

實際上,cv :: KeyPoint是一個包含cv :: Point作爲字段的結構。由於解決問題的代碼應如下所示:

std::for_each(keypoints1.begin(), keypoints1.end(), [](cv::KeyPoint & k) { 
    k.pt.x += 1.0; 
});