1

子午線と緯線を格納するための次のデータ構造があります。

各地図ポイントには、次のものが格納されます。
A] 地理的および空間座標、地図作成の歪みなど。
B] 北/南/東/西ノードへのポインター。

ポイント間の関係、まず子午線/平行線への所属を保存できます...

 class Node2DCart 
 { 
     protected: 
             //Coordinates of the point 
             double lat; 
             double lon; 
             double lattrans; 
             double lontrans; 
             double x; 
             double y; 
 ..... 
             //Pointers to adjacent points in geographic network 
             Node2DCart *left; 
             Node2DCart *right; 
             Node2DCart *top; 
             Node2DCart *bottom; 
 ..... 
 }; 

子午線のデータ構造には、子午線の経度、子午線の始点と終点、点数が格納されます。

 class Meridian 
 { 
     private: 
             unsigned int points_count; 
             double longitude; 
             Node2DCart *start; 
             Node2DCart *end; 
 .... 
 }; 

すべてのポイントはノード リストに格納されます。

typedef std::vector<Node2DCart*> TNodes2DCartList; 

class Node2DCartList 
{ 
     protected: 

             TNodes2DCartList nodes; 

     ... 
}; 

しかし、Node2DList のコピー コンストラクターの作成には大きな問題があります。Meridian/Parallel と Node2Dlist の間には循環的な依存関係があります。

コピー コンストラクターはstd::map古いポイントとリンクを使用して新しいものに置き換えますが、これは実装上の問題ではありません...ただし、クラス Meridian ポイントから古い Node2DList のポイントへのポインターの開始/終了... Node2DList コピー コンストラクターは、古いポイントを指すすべての子午線を通知する必要がありますNode2DList ポイントを変更し、すべてのポインタを新しい Node2DList ポイントに変更します。このモデルはそれを許可しません。

考えられる解決策は、子午線と平行点を指す 2 つのポインターを追加することです。

 class Node2DCart 
 { 
     protected: 
             //Coordinates of the point 
             double lat; 
             double lon; 
             double lattrans; 
             double lontrans; 
             double x; 
             double y; 
 ..... 
             //Pointers to adjacent points in geographic network 
             Node2DCart *left; 
             Node2DCart *right; 
             Node2DCart *top; 
             Node2DCart *bottom; 
 ..... 
             Meridian *m;
             Parallel *p;
 };

残念ながら、この提案されたモデルは良くありません。2 つのクラス間の循環参照がまだあります...誰かがそれを改善するのを手伝ってくれますか? ありがとう...

4

2 に答える 2

2

誰かが私がそれを改善するのを手伝ってくれるでしょうか?

そのような場合、私は一般的に次のようなものに頼ります:

 typedef int node_id_t;
 enum { NODE_NULL = 0 };
 // or enum node_id_t { NODE_NULL=0 }; for strict typing.

 class Node2DCart 
 { 
     protected:
             node_id_t id;    // id of the node
             //Coordinates of the point 
             double lat; 
             double lon; 
             double lattrans; 
             double lontrans; 
             double x; 
             double y; 
 ..... 
             //Pointers to adjacent points in geographic network 
             node_id_t left;
             node_id_t right; 
             node_id_t top; 
             node_id_t bottom; 
 ..... 
 };

 class Meridian
 {
     private:
             unsigned int points_count;
             double longitude;
             node_id_t start;
             node_id_t end;
 .... 
 };

 /* ... */

 std::vector<Node2DCart *> node_registry;

 // during initialization:
 node_registry.push_back( NULL );
 // to reserve 0th element to denote the NULL pointer

 Node2DCart *
 GetNode(node_id_t id)
 {
    // placeholder of the id range check
    return node_registry[id];
 };

 node_id_t
 AddNode(Node2DCart *n)
 {
    node_registry.push_back(n);
    return node_id_t(node_registry.size()-1);
 };

そして、のnode_id_t代わりに数値を使用しますNode2DCart *std::set(またはstd::map、で更新/テストされた)をスローして、AddNode()すべてのNode2DCartオブジェクトが一意であることを確認し、そうでない場合は既存のオブジェクトのIDを再利用することもできます。

基本的にアドレス指定スキームであり、各ノードに一意のグローバル識別子を提供します。グローバルコンテナを使用した、最も優れた/最も簡単なソリューションではありませんが、何度も助けてくれました。特に、メモリリークを回避し、相互依存するオブジェクトの階層全体を完全に破棄するためです。

代わりに、変換演算子をtypedef int node_id_t使用struct node_id_t { int id; };してオーバーロードして、ノードIDの検索を簡素化することもできます。

于 2010-09-09T14:21:27.730 に答える
0

私の意見では、ポインターをインデックスに置き換えるソリューションは、場合によっては遅くなります。

  • ポイントを削除しない場合、point_id はポイントのインデックスを表します。ノード[poin_id]、大丈夫です。

  • しかし、リストの任意のポイントを削除すると、point_id はリスト内のそのインデックスを表しません。std::find を使用して、見つかったポイントの point_id を取得する必要があります。これにより、コードの速度が大幅に低下します...

  • ポイントを削除すると、ポイントのリストを再インデックスして、上記の問題を回避できます。しかし、すべての子午線の開始/終了インデックスを再インデックス化することを忘れる必要はありません...しかし、それには時間がかかり、問題のコピー コンストラクターと同じことを行います。そして、コピーコンストラクターを使用して別のクラスによってあるクラスのデータに影響を与えることは、データ構造の適切な提案ではないと思います...

于 2010-09-09T17:21:52.347 に答える