gpt4 book ai didi

c++ - STL 指针集。复制构造函数问题

转载 作者:太空狗 更新时间:2023-10-29 20:30:07 26 4
gpt4 key购买 nike

我正在使用最新版本的 NetBeans 在 Ubuntu 11.10 下用 C++ 开发一个项目。我只会发布与问题相关的代码的最少部分。假设我有以下代码来解决图形问题:

typedef map<Node*, double, DereferenceCompare> Transitions;

class Node {
int _nodeNumber;
Transitions _transitions;
}

每个 Node 对象都包含指向其他 Node 对象的指针映射。现在我们有:

typedef set<Node*, DereferenceCompare> Nodes;

class Network {
Nodes _network;
}

问题:我对为网络类编写复制构造函数一头雾水。我想要实现的是能够执行以下操作:

Network n1;
Network n2(n1);
//Have both n1 and n2 identical in structure but distinct in memory (deep copy).

我的以下假设是否正确:如果我为 Node 类编写复制构造函数,它也需要复制 Transitions 容器。由于新节点尚不存在,此时的 Transitions 容器将保存指向旧节点的指针。

这是我在这里的第一篇文章。我希望我提供了清晰和充分的信息。如果我对我的问题不够连贯,我可以进一步澄清。任何帮助将不胜感激。

最佳答案

我以前做过同样的事情。这很棘手:

Network::Network(const Network& b) {
//old to new mapping
std::unordered_map<Node*, Node*> mapper(b._network.size());
// duplicate all nodes without links
for(auto iter = b.begin(); iter != b.end(); ++iter) {
Node* new_node = new Node();
try {
_network.insert(new_node);
} catch (std::bad_alloc& e) {
delete new_node;
throw;
}
mapper[iter->first] = _network; //and map the old Nodes to new ones
new_node->_nodeNumber = iter->_node_number;
}
// THEN map the links
for(auto iter = b.begin(); iter != b.end(); ++iter) {
Node* new_node = mapper[iter->first];
//for each link in the old one
for(auto iter2 = iter->_transitions.begin();
iter2 != iter->_transitions.end();
++iter2)
{
//link to the corresponding new node
Node* connection = mapper[iter2->first];
new_node->_transitions[connection ] = iter2->second;
}
}
}

[编辑] 现在异常安全
另请注意,除了编译之外,我没有尝试以任何方式验证代码。我只记得这是我多年前遇到同样问题时所做的。

关于c++ - STL 指针集。复制构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com