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

时间:2017-05-12 13:55:36

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

我看到了类似的问题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吗?

2 个答案:

答案 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;
}

你做错了什么:

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

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