2016-11-27 4 views
1

複数の1Dポイントを保持するSolutionクラスを作成する必要があります。このクラスには、中心とその中心に最も近いk個のポイントを計算するための数値kを指定できます。入れ子クラスからメンバ変数にアクセスする方法

私のコード、

class Solution { 
private: 
    int center_; 
    struct Point { 
     int x; 
     bool operator<(const Point &other) const { 
      return (x - center_) * (x - center_) < (other.x - center_) * (other.x - center_); 
     } 
    }; 
public: 
    vector<int> findNearestKPoints(vector<int> &nums, int k, int center) { 
     center_ = center; 

     // vetor<int> to vector<Point> 
     vector<Point> points; 
     for (int num : nums) { 
      points.push_back({num}); 
     } 

     // partition vector<Point> 
     nth_element(points.begin(), points.begin() + k - 1, points.end()); 

     // vector<Point> to vector<int> 
     vector<int> res; 
     for (int i = 0; i < k; ++i) { 
      const Point &point = points[i]; 
      res.push_back(point.val); 
     } 
     return res; 
    } 
} 

が、それはコンパイルできません。

コンパイルエラーはそれを修正するために、どのように

use of non-static data member 'center_' of 'Solution' from nested type 'Point' 

のですか? おそらく、最近点を計算する他の方法があります。

+3

'Point'は' Solution'か、単に 'Point'に' center_'を移動への参照を保持するために取得します。それがネストされたクラスであるという事実は、それがネストされたクラスへのアクセスを持っているという意味ではありません。 – DeiDei

+1

@DeiDei - それは非常に非効率的な解法です。あなたはすべてのポイントで4または8バイトの参照を持ちます単一のint値のデータこれは、50%または100%のオーバーヘッドです。ベクトルの点であるため、おそらくそれらの多くがあります。さらに、それぞれのポイントごとにリファレンスを初期化するという不便さもあります。参照は実行可能な解決策になる可能性がありますが、この特定の場合はそうではありません。 – dtech

答えて

4

PointクラスはSolutionクラスにアクセスできないため、Pointクラスコードでcenter_を使用することはできません。これは、PointSolutionが2つの異なるクラスであるためです。

ソリューションを機能させるには、にSolutionクラスに関する情報を提供するか、別のクラスを使用して比較する必要があります。私は、迅速な解決のための元を提案し、ラムダ関数を使用します。

bool Point::less(const Solution& sol, const& Point p) 
{ 
    return abs(sol.center_ - x) < abs(sol.center_ - p.x); 
} 

とあなたのfindNearestKPointsで:

Solution sol{ center }; 
nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), 
    [sol](const& Point a, const& Point b) 
    { 
     return a.less(sol, b); 
    }); 

、最終的な、無関係なノートに今using namespace stdそれほど一般的であり、なぜ?

1

あなたは、ラムダを使用してcenterをキャプチャすることができます。

nth_element(points.begin(), points.begin() + k - 1, points.end(), 
      [center](const& Point a, const& Point b) { 
       return abs(a.x - center) < abs(b.x - center); 
      }); 
関連する問題