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循环的情况下完成此操作?
感谢
答案 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;
});