代码之家  ›  专栏  ›  技术社区  ›  Jasper

C++:深度拷贝中的指针更新(有效)

  •  1
  • Jasper  · 技术社区  · 15 年前

    我的问题最好用一个代码示例来说明,所以让我们从这一点开始:

    class Game
    {
        // All this vector does is establish ownership over the Card objects
        // It is initialized with data when Game is created and then is never
        // changed.
        vector<shared_ptr<Card> > m_cards;
    
        // And then we have a bunch of pointers to the Cards.
        // All these pointers point to Cards from m_cards.
        // These could have been weak_ptrs, but at the moment, they aren't
        vector<Card*> m_ptrs;
    
        // Note: In my application, m_ptrs isn't there, instead there are
        // pointers all over the place (in objects that are stored in member
        // variables of Game.
        // Also, in my application, each Card in m_cards will have a pointer
        // in m_ptrs (or as I said, really just somewhere), while sometimes
        // there is more than one pointer to a Card.
    }
    

    现在我要做的是对这个游戏类做一个深入的复制。我制作了一个新的向量,其中包含新的共享指针,它指向新的卡片对象,这些对象是原始卡片对象的副本。那部分很容易。

    然后问题就开始了,M_指针的指针应该更新为指向M_卡片中的卡片,这不是一个简单的任务。

    我唯一能想到的方法是创建一个地图,并在复制M_卡的过程中填充它(用 map[oldPtr] = newPtr )然后使用它来更新m_ptrs。然而,这只是 O(m * log(n)) ( m = m_ptrs.size(); n = m_cards.size() )因为这将是一个非常正常的操作*我想有效地完成这项工作,并且我觉得它应该在 O(m) 使用自定义指针。然而,我似乎找不到一种有效的方法来做这件事。有人吗?

    *它被用来为人工智能创建一个测试台,让它“尝试”不同的动作。


    编辑:我想补充一点接受一个答案,因为我还没有。我一直在等待,直到我回到这个项目(因为我在这个项目上做了太多的工作,所以我走了一条旁道——如果你是为了乐趣而做的,那就要保持乐趣),所以在我接受一个答案之前,可能还要等一段时间。尽管如此,我还是会接受一个答案,所以不要担心:p


    编辑2:我还没有回到这个项目。现在,我正在考虑 o(m*log(n)) 不要抱怨,以后再看是否需要更快。然而,正如我最近花了一些时间来学习我的模式一样,我还认为我确实需要一段时间来重构这个项目。哦,我可能会花点时间,用我掌握的所有新知识来解决这个问题。因为没有一个回答说“坚持hashmap,稍后再看它是否真的需要更快”(如果有,我会非常失望,因为它不是我的问题的答案),我会推迟一个答案的选择一点,直到我回到这个项目。


    编辑:我还是没有回到这个项目。更准确地说,它被无限期地搁置。我很肯定我只是不会把我的头在 o(m*log(n)) 现在,如果结果是个问题,也许以后再看看。然而,这并不能很好地回答我的问题,因为我明确要求提高性能。我不想再不接受答案了,我选择了最有用的答案并接受了它。

    2 回复  |  直到 13 年前
        1
  •  3
  •   sbi    15 年前

    将指针存储为索引。 正如你所说,它们都指向M_卡,这是一个可以被索引的向量(这是正确的英语吗?). 您这样做只是为了存储它们,并在加载时将它们转换回指针。 或者您可以考虑使用索引来代替指针。

        2
  •  0
  •   Alex F    15 年前

    保持卡片元素索引而不是指针怎么样:

    vector<int> m_indexes;
    
    ...
    
    Card* ptr = &m_cards[m_indexes[0]];
    

    带索引的向量可以不加更改地复制。