【问题标题】:Struct comparator accessing another field in c++结构比较器访问c ++中的另一个字段
【发布时间】:2021-04-07 21:52:05
【问题描述】:

我正在尝试实施 Graham 扫描,我想做这样的事情:

private static void sortByPolar(Point[] points, Point r) {
    Arrays.sort(points, (p, q) -> {
    int compPolar = ccw(p, r, q);
    int compDist = dist(p, r) - dist(q, r); 
    return compPolar == 0 ? compDist : compPolar;
});

其中点 r 是最底点。但是,我正在努力在 c++ 中实现同样的想法,因为我只能传入比较的函数,我不知道它如何访问最低点。

struct compar {
  vector<vector<int>> lowest;
  bool operator()(vector<int> const& a, vector<int> const& b) {
    cout<<lowest[0]<<endl;    // throws an error, how do I get this function access to lowest?
    return // TODO;
  }
};

// in another function:
sort(points.begin(), points.end(), compar());

【问题讨论】:

    标签: c++ sorting struct grahams-scan


    【解决方案1】:

    您可以给compar 一个构造函数,并为您想要的数据提供一个参数,然后在创建临时实例时将其作为参数传入:

    struct compar {
      explicit compar(vector<int> const& lowest) : m_lowest(lowest) {}
      
      bool operator()(vector<int> const& a, vector<int> const& b) {
        cout<<m_lowest[0]<<endl;
        return // TODO;
      }
    
    private:
      vector<int> m_lowest;
    };
    
    // in another function:
    vector<int> lowestPoint;  // (get this from somewhere)
    sort(points.begin(), points.end(), compar(lowestPoint));
    

    顺便说一句,每个点的两个ints 的整个向量似乎很浪费,而且描述性也不是很好。为什么不做一个漂亮的Point 类型?

    struct Point
    {
       int x, y;
    };
    
    struct PointComparator
    {
       explicit PointComparator(const Point& lowest)
          : m_lowest(lowest)
       {}
       
       bool operator()(const Point& a, const Point& b)
       {
          std::cout << m_lowest[0] << std::endl;
          return; // TODO
       }
    
    private:
       Point m_lowest;
    };
    
    // in another function:
    Point lowestPoint;  // (get this from somewhere)
    std::sort(points.begin(), points.end(), PointComparator(lowestPoint));
    

    【讨论】:

    • 谢谢!现在我只是对显式关键字感到困惑。当我进行正常排序时,我会调用sort(sort(points.begin(), points.end(), compar()),而compar() 指向bool operator()(const Point&amp; a, const Point&amp; b) 函数,但现在compar(lowest) 指的是构造函数,那么它仍然如何工作?
    • @apluscs "compar() 指向 bool operator()(const Point& a, const Point& b) 函数" 不!那只是使用默认构造函数创建一个临时对象。 operator() 由排序算法为您完成。如果你自己做的话,它看起来像compare()(a, b)(或者,现在,compare(lowest)(a,b)):) 如果更清楚,你可以预先声明它:compar myCompar(lowest); sort(points.begin(), points.end(), myCompar);
    • @apluscs “现在我只是对显式关键字感到困惑。”当你有一个单参数构造函数时,这是一个很好的做法。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多