将常量添加到std :: vector的所有元素的一个子元素

时间:2014-02-16 15:01:29

标签: c++ opencv vector stl

在浏览stackoverflow之后,我找到了这个优雅的解决方案

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

向包含双精度的std :: vector的所有元素添加常量。 现在我正在使用关键点(opencv Keypoints),我有一个std::vector<cv::keypoints>

这些关键点包含许多元素,如Pt(x,y中的位置),大小,角度等... 我想为所有Pt添加一个常量,而Pt又包含另外两个参数(x和y)

我试着做

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

但是这不能编译。不幸的是,我对STL结构的复杂访问感到不太满意。

您是否知道如何在不使用for循环的情况下完成此操作?

感谢

3 个答案:

答案 0 :(得分:2)

在C ++ 11中,你可以使用这样的通用foreach循环来完成它:

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

这比使用std::transform的版本要少得多,而且更容易理解,同样有效。

答案 1 :(得分: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 :(得分:0)

实际上,cv :: KeyPoint是一个包含cv :: Point作为字段的结构。由于解决问题的代码应如下所示:

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