在向量的向量中找到 Point3f 的最大值

Posted

技术标签:

【中文标题】在向量的向量中找到 Point3f 的最大值【英文标题】:Find maximum for Point3f in vector of vector 【发布时间】: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. 【参考方案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 = Point3fminf, 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 谢谢,弄错了,我直接写了,没有检查返回类型。马上更新。

以上是关于在向量的向量中找到 Point3f 的最大值的主要内容,如果未能解决你的问题,请参考以下文章

vector<vector<Point3f>> 中的最大值

如何从提供的向量中找到最大的数字?

获取R向量中的所有最大值索引

使用 STL 算法在表(向量的向量、二维数组)中查找最小值/最大值的优雅方法

如何找到向量中的最大元素(C++)?

如何找到向量的统计信息?最大值/最小值、众数、中值、平均值