2011-06-22 14 views
1

私はいくつかの頂点オブジェクトインスタンスでいっぱいになっているベクトルを持っていて、 'x'とそれに続く 'y'座標に従ってソートする必要があります。オブジェクトのベクトルを並べ替える

私は出力として期待

#ifndef VERTEX_H 
#define VERTEX_H 1 

class Vertex 
{ 
private: 
    double __x; 
    double __y; 
public: 
    Vertex(const double x, const double y); 
    bool operator<(const Vertex &b) const; 
    double x(void); 
    double y(void); 
}; 

#endif // VERTEX_H 

vertex.cpp

#include "vertex.h" 

Vertex::Vertex(const double x, const double y) : __x(x), __y(y) 
{ 
} 

bool Vertex::operator<(const Vertex &b) const 
{ 
    return __x < b.x() || (__x == b.x() && __y < b.y()); 
} 

double Vertex::x(void) 
{ 
    return __x; 
} 

double Vertex::y(void) 
{ 
    return __y; 
} 

run.cpp

#include <algorithm> 
#include <stdio.h> 
#include <vector> 

#include "vertex.h" 

void prnt(std::vector<Vertex *> list) 
{ 
    for(size_t i = 0; i < list.size(); i++) 
    printf("Vertex (x: %.2lf y: %.2lf)\n", list[i]->x(), list[i]->y()); 
} 

int main(int argc, char **argv) 
{ 
    std::vector<Vertex *> list; 
    list.push_back(new Vertex(0, 0)); 
    list.push_back(new Vertex(-3, 0.3)); 
    list.push_back(new Vertex(-3, -0.1)); 
    list.push_back(new Vertex(3.3, 0)); 

    printf("Original:\n"); 
    prnt(list); 

    printf("Sorted:\n"); 
    std::sort(list.begin(), list.end()); 

    prnt(list); 

    return 0; 
} 

があるvertex.h:

Original: 
Vertex (x: 0.00 y: 0.00) 
Vertex (x: -3.00 y: 0.30) 
Vertex (x: -3.00 y: -0.10) 
Vertex (x: 3.30 y: 0.00) 
Sorted: 
Vertex (x: -3.00 y: -0.10) 
Vertex (x: -3.00 y: 0.30) 
Vertex (x: 0.00 y: 0.00) 
Vertex (x: 3.30 y: 0.00) 

しかし、私は実際に取得することです:

Original: 
Vertex (x: 0.00 y: 0.00) 
Vertex (x: -3.00 y: 0.30) 
Vertex (x: -3.00 y: -0.10) 
Vertex (x: 3.30 y: 0.00) 
Sorted: 
Vertex (x: 0.00 y: 0.00) 
Vertex (x: -3.00 y: -0.10) 
Vertex (x: -3.00 y: 0.30) 
Vertex (x: 3.30 y: 0.00) 

私は正確に間違って起こっているかわからない、任意のアイデア?

+0

どうすればコンパイルできますか?あなたの演算子はconst&Vertexをとりますが、 'double Vertex :: x()const'はありません。 – Chris

+1

これを読んでください:http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –

+0

StackOverflowへようこそ私たちが通常行うここでの3つのことを思い出させてください:1)あなたが助けを受けても、あなたの専門分野で**質問に答えるようにしてください** [[FAQを読む]](http://tinyurl.com/2vycnvr )3)良いQ&Aを見たら、[灰色の三角形を使って]投票してください(http://i.imgur.com/kygEP。png)。システムの信頼性は、ユーザーが知識を共有して得た評判に基づいているためです。また、あなたの問題をより良く解決する答えを受け入れることを覚えておいてください。(「チェックマークの印を押して」) –

答えて

6

Vertex *をコンテナに保管していない場合は、Vertexです。 std::sortに電話すると、実際にはアイテム自体ではなくポインタの値がソートされます。

あなた本当には(私は疑う)のポインタを格納する必要がある場合は、あなたが(未テスト)このような回避策を使用することができます:あなたはソート何らかの理由でabolute値になりたいよう

struct less_than_key { 
    inline bool operator() (const Vertex*& v1, const Vertex*& v2) { 
     return ((*v1) < (*v2)); 
    } 
}; 
std::sort(list.begin(), list.end(), less_than_key()); 
+0

それはありがたいです。 – Wanderson

+0

@Wandersonだから問題をどのように修正しましたか? ? std :: vector を標準に変更しました:: またはsth else? – shengy

+0

非ポインタへのポインタを変更せずに修正するための編集を追加しました。私はコンパイルしようとしなかったので、間違いを犯した場合は、私が編集できるように私に知らせてください。 – jterrace

0

らしいです:
はこれを試してみてください:

bool Vertex::operator<(const Vertex &b) const 
{ 
    return std::abs(__x) < std::abs(b.__x) || (std::abs(__x) == std::abs(b.__x) && std::abs(__y) < std::abs::(b.__y)); 
} 

注意:あなたは同じクラスである場合に、別のオブジェクトのメンバを取得するためにBXを()を呼び出す必要はありません。あなたは他のメンバーにアクセスできます。

メモ:は、識別子に二重下線を使用しないでください。識別子の先頭にアンダースコアを付けないでください。

+0

実際には、リストの先頭に一番左の頂点が必要です。そして絶対値にすることはできません。 – Wanderson

1

実際の頂点オブジェクトではなく、ポインタをソートしています。これを試してください:

std::vector<Vertex> list; 
list.push_back(Vertex(0, 0); 
list.push_back(Vertex(-3, 0.3); 
... 

つまり、リストコンテナ内のポインタを取り除き、push_backの呼び出しで新しいポインタを削除します。

1

あなたはすべてのこれらのクラスを自分で書く(ダブルアンダースコアのルールに違反する!)自分自身を保存したい場合は、あなただけの

std::vector< std::pair<float, float> > 

std::sortを使用しての使用を検討できます。ペアはデフォルトで辞書編集で比較されます(あなたが求めているものです)ので、特別なコードは必要ありません。

+0

私はstd :: pairを使うことができますが、Vertexクラスの単純化されたバージョンです。完全なものには、必要な角度、距離、その他の計算方法があります。ダブルアンダースコアルールについては、将来のコードに適用することを確認します。 – Wanderson

+0

@Wanderson:十分に公正。これらの変換と計算のための自由な関数を手に入れることができない場合は、独自のクラスを作成する必要があります(ペアデータをメインデータメンバーとして持つことができます)。 –

関連する問題