2016-06-01 3 views
0

私はいくつかの計算に基づいてソートしようとしているstd :: listを持っています。 Point2Dはint no、double x、およびdouble yのみを持つ構造体です。ここでC++でのカスタムリストソートの比較

は、私はlist.sortコードが含まれている方法です。

std::vector<Point2D> GrahamScan::getSortedPointSet(std::vector<Point2D> points) { 
Point2D lowest = getLowestPoint(points); 

std::list<Point2D> list; 

for (int i = 0; i < (int)points.size(); i++) { 
    list.push_back(points[i]); 
} 

list.sort(compare_points); 

std::vector<Point2D> temp; 
for (int i = 0; i < (int)list.size(); i++) { 
    temp.push_back(list.front()); 
    list.pop_front(); 
} 
return temp; 
} 

そして、ここで私が書いたcompare_points方法です:

bool GrahamScan::compare_points(const Point2D& a, const Point2D& b) { 
if (a.x == b.x && a.y == b.y) { 
    return false; 
} 

double thetaA = atan2((long)a.y - lowest.y, (long)a.x - lowest.x); 
double thetaB = atan2((long)b.y - lowest.y, (long)b.x - lowest.x); 

if (thetaA < thetaB) { 
    return false; 
} 
else if (thetaA > thetaB) { 
    return true; 
} 
else { 
    double distanceA = sqrt((((long)lowest.x - a.x) * ((long)lowest.x - a.x)) + 
     (((long)lowest.y - a.y) * ((long)lowest.y - a.y))); 
    double distanceB = sqrt((((long)lowest.x - b.x) * ((long)lowest.x - b.x)) + 
     (((long)lowest.y - b.y) * ((long)lowest.y - b.y))); 

    if (distanceA < distanceB) { 
     return false; 
    } 
    else { 
     return true; 
    } 
} 
} 

をVisual Studioは私に吐き出しているエラーは「GrahamScanですが。 :compare_points ":非標準構文。私はC++での多くの経験を持っていないが、私はC++にTreeSetのを使用しており、これが私の試みである、いくつかのJavaコードを変換しようとしている「のメンバーに

をポインタを作成するために、「&」を使用しています。

どのような援助をいただければ幸いです

+0

http://stackoverflow.com/a/4288479/212870 –

+3

比較関数を作ります'static'を実行して再試行してください。しかし、比較関数の* strict-weak-order *要件を警告してくれます。あなたの実装は複雑で、この要件に従うかどうかは分かりません。 – PaulMcKenzie

答えて

2

あなたは、あなたはそれを静的にする必要がありGrahamScan名前空間にcompare_pointsを維持したい場合:コンパイラは文句を言い

static bool GrahamScan::compare_points 

理由はをということですはメンバ関数です。それにはGrahamScanオブジェクトが必要です。カーテンの裏には、compare_pointsの実際の機能署名はbool compare_points(GrahamScan *this, const Point2D& a, const Point2D& b)のようなものです。だからそれを静的にするか、それをメンバ関数として定義しないでください。

compare_pointsを静的にすると、最も低い変数にはアクセスできなくなります。それを回避する簡単な方法は、最低でも静的にすることです:

class GrahamScan 
{ 
    // declaration is inside class 
    static Point2D lowest; 
} 

// definition is outside class 
Point2D GrahamScan::lowest; 

とこのようにそれを使用します。

std::vector<Point2D> GrahamScan::getSortedPointSet(std::vector<Point2D> points) 
{ 
    GrahamScan::lowest = getLowestPoint(points); 
    //... 
} 
+0

今私は "未解決の外部シンボル"プライベートを取得しています:静的構造体Point2D GrahamScan ::最低 ""エラー。私はPoint2D変数を静的変数として宣言してみましたが、 – awbasham

+0

@awbasham静的変数が正しく宣言されていることを確認してください。 GrahamScanの内部では静的なPoint2Dを最低限使用し、GrahamScanの外側には '' Point2D GrahamScan :: lowest'''を置いてGrahamScan ::最低 '' '。 – kaspersky

+0

「GrahamScan外のPoint2D GrahamScan :: lowestをどこかに置く」とはどういう意味ですか? – awbasham