如何从嵌套类

时间:2016-11-27 23:59:24

标签: c++ c++11

我需要创建一个包含多个1D点的解决方案类,并且可以给出一个中心和一个数字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'

那么如何解决呢? 也许有其他方法来计算最近点。

2 个答案:

答案 0 :(得分:4)

您的Point班级无法访问Solution班级,因此您无法在Point类代码中使用center_。这是因为PointSolution是两个不同的类。

要使您的解决方案有效,您需要向Solution提供有关Point课程的信息,或使用其他课程进行比较。我建议前者快速解决并使用lambda函数:

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 :(得分:1)

您可以使用lambda并捕获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);
            });