了解vector <shared_ptr <t>&gt;,shared_ptr <vector <t>&gt;或vector <t> </t> </vector <t> </shared_ptr <t>

时间:2013-06-07 15:07:26

标签: c++ boost stl

Node是解析图形时用于存储Node的数据结构。

以下是示例代码:

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 &gt;每当复制NodeB的实例时,也会复制存储在向量中的元素集合。由于每个元素都是shared_ptr,因此与NodeA相比,复制操作更便宜。

问题1.2 &gt;每当复制一个NodeC实例时,ONLY复制的元素就是shared_ptr,并且不复制底层矢量,而是在所有引用的shared_ptr中共享它。

问题2 &gt;应该使用NodeC的实现来使副本最便宜。如果是这种情况(我怀疑),为什么我大部分时间都会看到NodeB的使用而不是NodeC?

谢谢

2 个答案:

答案 0 :(得分:2)

1.1)正确

1.2)正确

2.0)因为boost :: shared_ptr主要用途不是提供廉价的副本,而是为了管理生命周期。否则原始指针也足够了。向量通常被定义为成员对象,并使用其父对象自动销毁,其中位于向量中的对象被插入,移除和移动。

答案 1 :(得分:1)

  

问题2&gt;应使用NodeC的实现来制作副本   最便宜的。如果是这种情况(我怀疑),为什么我看到的用法   NodeB大部分时间而不是NodeC?

正如enigma所说,使用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.