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?
谢谢
答案 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.