我看到了类似的问题here,但我没有得到我想要的东西。我有类似的东西
vector< vector<Point3f> > 3dpoints;
现在假设我想找到仅x坐标的最大值,并希望打印与之关联的所有其他值。我尝试过如下,但是它会向成员'开始'提出错误请求...
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中的max吗?
答案 0 :(得分:1)
你可以通过单次传递来做到这一点:
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
这是一个展示这个想法的例子,在你的代码中你可能想要替换&lt;和==使用epsilon来正确比较浮点数。
显示的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
}
答案 1 :(得分:1)
根据您的最新评论,代码应为:
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;
}
你做错了什么:
修改强> 感谢@Slava指出std :: max_element返回一个迭代器。