【问题标题】:Add a constant to one sub-element of all elements of an std::vector向 std::vector 的所有元素的一个子元素添加一个常量
【发布时间】:2014-03-15 19:01:15
【问题描述】:

在查看 stackoverflow 后,我发现了这个优雅的解决方案

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

为包含双精度的 std::vector 的所有元素添加一个常量。 现在我正在使用关键点(opencv Keypoints)我有一个std::vector&lt;cv::keypoints&gt;

这些关键点包含许多元素,如 Pt(x,y 中的位置)、大小、角度等... 我想为所有 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 循环的情况下完成此操作吗?

谢谢

【问题讨论】:

    标签: c++ opencv vector stl


    【解决方案1】:

    如果您想就地应用修改,最好使用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 的版本要少得多,而且更容易理解,而且同样有效。

      【讨论】:

      • 假设我发现这比for_each 和/或std::transform 版本(我这样做)更容易阅读。在任何情况下我仍想使用for_eachstd::transform
      • @Nemo:我相信我们可以发明一些 STL 算法可能更好的情况。但我没有立即想到,所以如果我们真的不能使用简单的方法,也许我们可以同意 KISS 并在某一天看看 STL 的东西。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 2019-07-30
        • 1970-01-01
        • 2015-04-20
        • 2021-08-03
        • 2012-04-01
        相关资源
        最近更新 更多