現在、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() {}
これは暫定的なコードであることに注意してください。私はまだ何もコンパイルしていません。
ただし、次の質問が発生します。
std::shared_ptr
ですか? これを使用してEdge
sからs へNode
の参照をカウントすると、ノードが分離されているかどうかを簡単に判断できます。私の機種で、交換std::shared_ptr
は可能std::weak_ptr
でしょうか?私が理解する限り、いいえ。ではEdge
、shared_ptr<Node>
実際に参照をカウントできるようにする必要があります。私Node
の では、shared_ptr<Edge>
実際に Edge を参照し続け、失わないようにする必要があります。
程度は低いですが、使用size_t D
することは私のテンプレートにとって意味がありますか? (巨大なネットワークに対処するために数テラバイトのコンピューターでこのモデルを使用する可能性が低いことは別として...)
たとえこれが意見の分かれる答えを引き寄せるかもしれないとしても、私はデザインの代替案にオープンです。
shared_ptr
ここでは、他のスマート ポインターは間違ったツールだと思います。理由:
shared_ptr
は、制御ブロック (参照カウンターとデリータが格納されている場所) をヒープ上に割り当てることが含まれます。shared_ptr
size は 2 つのポインタのサイズです。参照カウンターのメンテナンスにはアトミックな命令が含まれるため、シングルスレッドのユースケースでは不必要なレイテンシーが発生します。言い換えれば、shared_ptr
は入手可能な最も高価なポインタの 1 つです。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加