在向量的向量中找到 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。
你用的是什么编译器? 3dpoints
should 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
上的 <
。
第一次使用将一个点映射到其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<cv::Point3_<float>*, std::vector<cv::Point3_<float> > >’ has no member named ‘y’
和z
一样
@noexistence 不知道Point3f的内容,把'y'、'z'换成代表y和z值的成员。 highest
是子向量3dpoints[r]
中x 值最大的Point3f@
成员确实是 'x' 'y' 和 'z' 但 std::max_element
返回迭代器。所以你的代码需要改成highest->x
等
@Slava 谢谢,弄错了,我直接写了,没有检查返回类型。马上更新。以上是关于在向量的向量中找到 Point3f 的最大值的主要内容,如果未能解决你的问题,请参考以下文章