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

标签 c++ pointers stl graph copy-constructor

我正在使用最新版本的 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/

相关文章:

c++ - 无法解析的 `R_X86_64_NONE` 重定位

c++ - 如何在运行时将指针设置为 Null (C++)

在 C 中转换指针

c++ - 以老式(和肮脏的)方式填充 vector<char>

c++ - 包含对象指针的 STL 堆

c++ - 不确定使用哪种数据结构

c++ - C1189 : #error : WINDOWS. H 已经包括在内。 MFC 应用程序不得#include <windows.h>

c++ - 简单乘法后得到错误的结果 - C++

c - 从C中的结尾访问数组?

c++ - 子类化 STL 容器 : Range Constructors don't work