1

ノードは、グラフを解析するときにノードを格納するために使用されるデータ構造です。

サンプルコードは次のとおりです。

struct NodeA {
    vector<string> vecStrs; // the size of the vecStrs keeps increasing!
};
struct NodeB {
    vector<boost::shared_ptr<string> > vecShpStrs;
};

struct NodeC {
    boost::shared_ptr<vector<string> > shpVecStrs;
};

int main()
{
    NodeA nodeA;
    nodeA.vecStrs.push_back("stringA");    // input
    cout << "Output from NodeA: " << nodeA.vecStrs.front() << endl; // output

    NodeB nodeB;
    nodeB.vecShpStrs.push_back(boost::make_shared<string>("stringB"));
    cout << "Output from NodeB: " << *(nodeB.vecShpStrs.front()) << endl;

    NodeC nodeC;
    nodeC.shpVecStrs.reset(new vector<string>());
    nodeC.shpVecStrs->push_back("stringC");
    cout << "Output from NodeC: " << nodeC.shpVecStrs->front() << endl;
}

私の理解を確認し、それが正しいかどうかを確認してください

質問 1.1 > NodeB のインスタンスがコピーされるたびに、ベクターに格納されている要素のコレクションもコピーされます。各要素は shared_ptr であるため、コピー操作は NodeA に比べて安価です。

質問 1.2 > NodeC のインスタンスがコピーされるときはいつでも、唯一のコピーされる要素は shared_ptr であり、基礎となるベクトルはコピーされず、参照されるすべての shared_ptr で共有されます。

質問 2 > NodeC の実装を使用して、コピーのコストを最小限に抑える必要があります。もしそうなら(私は疑問に思います)、NodeCの代わりにNodeBの使用がほとんどの場合に見られるのはなぜですか?

ありがとうございました

4

2 に答える 2

2

1.1) 正しい

1.2) 正しい

2.0) boost::shared_ptr の主な用途は安価なコピーを提供することではなく、寿命を管理することです。それ以外の場合は、生のポインターでも十分です。多くの場合、ベクターはメンバー オブジェクトとして定義され、ベクター内にあるオブジェクトが挿入、削除、および移動される親と共に自動的に破棄されます。

于 2013-06-07T15:12:33.603 に答える
1

質問 2> NodeC の実装を使用して、コピーのコストを最小限に抑える必要があります。もしそうなら(私は疑問に思います)、NodeCの代わりにNodeBの使用がほとんどの場合に見られるのはなぜですか?

エニグマが言ったように、コピーを作成するために NodeC を使用するのは間違っています。なぜなら、ベクトルをコピーするのではなく、共有する (スマート ポインターをコピーする) だけだからです。例えば:

NodeC nodeC;
nodeC.shpVecStrs.reset(new vector<string>());
nodeC.shpVecStrs->push_back("stringC");
assert(nodeC.shpVecStrs->size() == 1);

NodeC nodeC2 = nodeC;
nodeC2.shpVecStrs->push_back("other string");
assert(nodeC2.shpVecStrs->size() == 2);
assert(nodeC.shpVecStrs->size() == 2); // they are the same pointer.
于 2013-06-07T15:51:39.070 に答える