共有ポインターを使用して C++ でネットワークをモデル化することは、まともな設計ですか?

メガバイト

現在、C++ の知識を広げている最中です。このために、テンプレート Network をコーディングしています。(実際の演習は、プロジェクト オイラーの問題 107です。興味のある人がいたら。)

C++11 のポインタについて調べてみると、私のクラスの次の設計がもっともらしく見えます。

template< typename T, size_t D >
class Network<T,D>
{
  public:
    Network();
    ~Network();
    bool add_edge( size_t, size_t, T );
    bool remove_edge( size_t, size_t );
    struct Node;
    struct Edge;
  private:
    vector<Node> network;
};

次の予備的な実装で

template< typename T, size_t D >
struct Network<T,D>::Edge
{
  pair<shared_ptr<Node>,shared_ptr<Node>> vertices;
  T weight;
}

template< typename T, size_t D >
struct Network<T,D>::Node
{
  Node( size_t idx )
    index = idx;

  size_t index;
  vector<shared_ptr<Edge>> connections;
};

template< typename T, size_t D >
Network<T,D>::Network( )
{
  network.reserve( D );
  for( size_t s = 0; s <= D; s++ )
    network.push_back( Node(s) );
}

template< typename T, size_t D >
Network<T,D>::~Network() {}

これは暫定的なコードであることに注意してください。私はまだ何もコンパイルしていません。

ただし、次の質問が発生します。

  1. これは の正当な使用std::shared_ptrですか? これを使用してEdgesからs へNode参照をカウントすると、ノードが分離されているかどうかを簡単に判断できます。
  2. 私の機種で、交換std::shared_ptr可能std::weak_ptrでしょうか?私が理解する限り、いいえ。ではEdgeshared_ptr<Node>実際に参照をカウントできるようにする必要があります。私Nodeの では、shared_ptr<Edge>実際に Edge を参照し続け、失わないようにする必要があります。

  3. 程度は低いですが、使用size_t Dすることは私のテンプレートにとって意味がありますか? (巨大なネットワークに対処するために数テラバイトのコンピューターでこのモデルを使用する可能性が低いことは別として...)

  4. たとえこれが意見の分かれる答えを引き寄せるかもしれないとしても、私はデザインの代替案にオープンです。

マキシム・エゴルシキン

shared_ptrここでは、他のスマート ポインターは間違ったツールだと思います。理由:

  1. ノードとエッジの明確な所有者が 1 つあります。隣接行列です。ノードを配列に (今のように) 格納し、エッジを行列に格納します (両方とも値によって)。共有ポインタは、所有権を確立するのが難しい場合 (そして、よく考えられていない設計の兆候である場合) に役立ちます。
  2. ノード自体に入力/出力エッジの数を保存する方が簡潔で効率的です。
  3. 構築にshared_ptrは、制御ブロック (参照カウンターとデリータが格納されている場所) をヒープ上に割り当てることが含まれます。shared_ptrsize は 2 つのポインタのサイズです。参照カウンターのメンテナンスにはアトミックな命令が含まれるため、シングルスレッドのユースケースでは不必要なレイテンシーが発生します。言い換えれば、shared_ptrは入手可能な最も高価なポインタの 1 つです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

forループで作成されたC ++ポリモーフィックポインターは同じものを参照しますが、これはスマートポインターを使用していないためですか?

分類Dev

BoostPythonを介してC ++オブジェクト間で共有ポインターを渡すことによるセグメンテーション違反

分類Dev

プレーン「c」で「void *」ポインタなしで一般的なデータ構造を設計することは可能ですか?

分類Dev

C ++ / QT:読み取り専用データ共有としてプライベートメンバーへの定数ポインターを使用

分類Dev

Cのプロセス間でポインターを使用して構造体を共有するにはどうすればよいですか?

分類Dev

C ++は、ヘッダーで初期化された静的constメンバーが、コンパイルユニットとライブラリ間で単一のインスタンスを共有することを保証しますか?

分類Dev

C99:動的割り当てなしで抽象データ型を設計することは可能ですか?

分類Dev

ネットワークインターフェイスがC ++を使用してプログラムでインターネットに接続されていることをどのように検出できますか?

分類Dev

グローバル変数を使用するC ++は、pthreadを使用すると、ポインターよりも100%遅いことを示していますか?

分類Dev

Objective cでJavaモデルをインポートすることは可能ですか?

分類Dev

toupperなしでCのループを使用してchar *ポインターを小文字/大文字に変換することはできません

分類Dev

Pythonctypesを使用してC ++共有ライブラリをロードすることはできません

分類Dev

C#グループボックスのタイトルをラジオボタンとして作成することはできますか?

分類Dev

NULLチェックを使用して汎用C ++関数ポインターラッパーを作成することは可能ですか?

分類Dev

PFCTL(OS X)を使用して、インターネットをルーターとしてではなくブリッジとして共有しますか?

分類Dev

C#メモリ内データベースはインデックスを共有しますか?

分類Dev

cランタイムを破棄するが、それでも共有ライブラリをロードして使用できるようにする方法は?

分類Dev

C ++のデフォルト引数でテンプレートパラメータをスキップすることは本当に不可能ですか、なぜ構文はそうではないことを示唆していますか?

分類Dev

C ++で関数ポインタをテンプレートパラメータとして渡すことができるのはなぜですか?

分類Dev

Cのポインタ演算を使用して構造体のデータにアクセスすることは可能ですか?

分類Dev

C#クレデンシャルを使用してAzure関数からオンプレミスネットワーク共有にアクセスする

分類Dev

C ++ 17では、全順序ではないコンパレータを使用している場合でも、減少しないということは必ずしもソートされていることを意味しますか?

分類Dev

C ++で初期化するときに、大きなメモリブロックをベクターに割り当てることができますか?

分類Dev

別のネットワークのサーバー/クライアントソケットをアドレス指定することは可能ですか?(C ++)

分類Dev

TP-Link Archer C9ルーターをアクセスポイントとして設定するにはどうすればよいですか?

分類Dev

TP-Link Archer C9ルーターをアクセスポイントとして設定するにはどうすればよいですか?

分類Dev

ポインタ(C ++)を使用すると、初期化されていないヒープメモリエラーが発生するのはなぜですか?

分類Dev

MonodevelopのMoqフレームワークを使用してC#でファイルを読み取ることによるテキスト出力をモックするにはどうすればよいですか?

分類Dev

C ++ 11中括弧の初期化構文を使用して、単純な集計の簡単なコンストラクターを宣言しないようにすることはできますか?

Related 関連記事

  1. 1

    forループで作成されたC ++ポリモーフィックポインターは同じものを参照しますが、これはスマートポインターを使用していないためですか?

  2. 2

    BoostPythonを介してC ++オブジェクト間で共有ポインターを渡すことによるセグメンテーション違反

  3. 3

    プレーン「c」で「void *」ポインタなしで一般的なデータ構造を設計することは可能ですか?

  4. 4

    C ++ / QT:読み取り専用データ共有としてプライベートメンバーへの定数ポインターを使用

  5. 5

    Cのプロセス間でポインターを使用して構造体を共有するにはどうすればよいですか?

  6. 6

    C ++は、ヘッダーで初期化された静的constメンバーが、コンパイルユニットとライブラリ間で単一のインスタンスを共有することを保証しますか?

  7. 7

    C99:動的割り当てなしで抽象データ型を設計することは可能ですか?

  8. 8

    ネットワークインターフェイスがC ++を使用してプログラムでインターネットに接続されていることをどのように検出できますか?

  9. 9

    グローバル変数を使用するC ++は、pthreadを使用すると、ポインターよりも100%遅いことを示していますか?

  10. 10

    Objective cでJavaモデルをインポートすることは可能ですか?

  11. 11

    toupperなしでCのループを使用してchar *ポインターを小文字/大文字に変換することはできません

  12. 12

    Pythonctypesを使用してC ++共有ライブラリをロードすることはできません

  13. 13

    C#グループボックスのタイトルをラジオボタンとして作成することはできますか?

  14. 14

    NULLチェックを使用して汎用C ++関数ポインターラッパーを作成することは可能ですか?

  15. 15

    PFCTL(OS X)を使用して、インターネットをルーターとしてではなくブリッジとして共有しますか?

  16. 16

    C#メモリ内データベースはインデックスを共有しますか?

  17. 17

    cランタイムを破棄するが、それでも共有ライブラリをロードして使用できるようにする方法は?

  18. 18

    C ++のデフォルト引数でテンプレートパラメータをスキップすることは本当に不可能ですか、なぜ構文はそうではないことを示唆していますか?

  19. 19

    C ++で関数ポインタをテンプレートパラメータとして渡すことができるのはなぜですか?

  20. 20

    Cのポインタ演算を使用して構造体のデータにアクセスすることは可能ですか?

  21. 21

    C#クレデンシャルを使用してAzure関数からオンプレミスネットワーク共有にアクセスする

  22. 22

    C ++ 17では、全順序ではないコンパレータを使用している場合でも、減少しないということは必ずしもソートされていることを意味しますか?

  23. 23

    C ++で初期化するときに、大きなメモリブロックをベクターに割り当てることができますか?

  24. 24

    別のネットワークのサーバー/クライアントソケットをアドレス指定することは可能ですか?(C ++)

  25. 25

    TP-Link Archer C9ルーターをアクセスポイントとして設定するにはどうすればよいですか?

  26. 26

    TP-Link Archer C9ルーターをアクセスポイントとして設定するにはどうすればよいですか?

  27. 27

    ポインタ(C ++)を使用すると、初期化されていないヒープメモリエラーが発生するのはなぜですか?

  28. 28

    MonodevelopのMoqフレームワークを使用してC#でファイルを読み取ることによるテキスト出力をモックするにはどうすればよいですか?

  29. 29

    C ++ 11中括弧の初期化構文を使用して、単純な集計の簡単なコンストラクターを宣言しないようにすることはできますか?

ホットタグ

アーカイブ