【问题标题】:Find maximum for Point3f in vector of vector在向量的向量中找到 Point3f 的最大值
【发布时间】:2017-05-12 13:55:36
【问题描述】:

我看到了一个类似的问题here,但我没有得到我想要的东西。我有这样的东西

vector< vector<Point3f> > 3dpoints;

现在假设我只想找到 x 坐标的最大值,并想打印与其相关的所有其他值。我尝试如下,但它抛出了一些错误 request for member 'begin' ...

for( auto r = 0; r < 3dpoints.size(); r++ ) {
    for( auto s = 0; s < 3dpoints[r].size(); s++ ) {
        cout<< max_element( 3dpoints[r][s].x.begin(), 3dpoints[r][s].x.end() ) << endl; 
    } 
}

我知道我缺少一些基本的东西,但我无法得到它。谁能帮我在 Point3f 中找到最大值?

【问题讨论】:

  • 试过如下?那个线程是什么?您可以发布您尝试过的内容吗?
  • 您能否也将错误消息添加到您的代码中? x 的数据类型是什么?我认为它可能是一个双精度或浮点数,所以它不会有一个开始......你能告诉我们你的 max_element 函数吗?
  • 你必须提供特殊的比较功能才能只检查x字段。
  • *max_element( 3dpoints[r][s].begin(), 3dpoints[r][s].end(), LessByX{} ); 带有适当的LessByX Functor。
  • 你用的是什么编译器? 3dpointsshould not be accepted as a valid identifier.

标签: c++ opencv c++11 vector


【解决方案1】:
template<class F>
struct projected_order_t {
  F f;
  template<class Lhs, class Rhs>
  bool operator()(Lhs const& lhs, Rhs const& rhs)const {
    return f(lhs) < f(rhs);
  }
};
template<class F>
projected_order_t<F> projected_order(F f) {
  return {std::move(f)};
}

auto max_elem_of_vector = [](std::vector<Point3f> const& pts){
  return std::max_element( pts.begin(), pts.end(), projected_order(
    [](Point3f pt){ return pt.x; }
  ));
};
auto max_x_of_vector = [](std::vector<Point3f> const& pts){
  auto it = max_elem_of_vector(pts);
  if (it == pts.end()) return std::numeric_limits<float>::min();
  return it->x;
};
auto max_elem_of_v_of_v = [](std::vector<std::vector<Point3f>> const& pts){
  auto it = std::max_element( pts.begin(), pts.end(), projected_order(
    max_x_of_vector
  ));
  auto minf = std::numeric_limits<float>::min();
  auto minp = Point3f{minf, minf, minf};
  if (it == pts.end())
    return minp
  auto it2 = max_elem_of_vector(*it);
  if (it2 == it->end()) 
    return minp;
  return *it2;
};

max_elem_of_v_of_v 应该可以解决您的问题。

Projected order 采用投影(从类型 A 到类型 B 的映射),并返回类型 A 上的排序,该排序使用到 B 的映射和 B 上的 &lt;

第一次使用将一个点映射到其x 坐标;这让我们可以通过x 坐标找到点向量中的最大元素。

第二种用法将一个点向量映射到该向量中任何元素的最大 x。我们用它来找到具有最大 x 元素的向量。

然后我们从具有最大 x 元素的最大向量中提取元素。

如果没有最小元素,则返回最小浮点值。

【讨论】:

    【解决方案2】:

    您可以通过单次传递来做到这一点:

    vector< vector<Point3f> > points;
    vector<Point3f> maxes;
    for( const auto &v : points ) {
        for( const auto &p : v ) {
            if( not maxes.empty() and maxes.front().x < p.x )
                maxes.clear();
            if( maxes.empty() or maxes.front().x == p.x )
                maxes.push_back( p );
        }
    }
    // here you have list of all points with max x in maxes
    

    这是一个展示这个想法的示例,在您的代码中,您可能希望将

    显示的 PS 代码对所有数据执行此操作,您提到您需要为每一行单独执行此操作。可以很容易地更改代码来做到这一点:

    for( const auto &v : points ) {
        vector<Point3f> maxes;
        for( const auto &p : v ) {
            if( not maxes.empty() and maxes.front().x < p.x )
                maxes.clear();
            if( maxes.empty() or maxes.front().x == p.x )
                maxes.push_back( p );
        }
        // print maxes here
    }
    

    【讨论】:

      【解决方案3】:

      根据您最新的 cmets,代码应为:

      for( auto r = 0; r < 3dpoints.size(); r++ ) {
         auto highest = max_element(begin(3dpoints[r]), end(3dpoints[r]),
                                    [](const Point3f &lhs, const Point3f &rhs) 
                                      { return lhs.x < rhs.x; })
         cout << highest->y << highest->z << endl;
      }
      

      你做错了什么:

      • 3dpoints[r][s].x 是一个浮点数,没有 begin()/end()。
      • 您需要为 max_element 提供自定义比较函数。

      编辑 感谢@Slava 指出 std::max_element 返回一个迭代器。

      【讨论】:

      • 我试过你的代码,但说class __gnu_cxx::__normal_iterator&lt;cv::Point3_&lt;float&gt;*, std::vector&lt;cv::Point3_&lt;float&gt; &gt; &gt;’ has no member named ‘y’ z一样
      • @noexistence 不知道Point3f的内容,把'y'、'z'换成代表y和z值的成员。 highest 是子向量3dpoints[r]中x 值最大的Point3f@
      • 成员确实是 'x' 'y' 和 'z' 但 std::max_element 返回迭代器。所以你的代码需要改成highest-&gt;x
      • @Slava 谢谢,弄错了,我直接写了,没有检查返回类型。马上更新。
      猜你喜欢
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2018-05-30
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多