私の質問はコードサンプルで最もよく説明されているので、それから始めましょう:
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.
}
ここでやりたいことは、この Game クラスのディープ コピーを作成することです。元の Card オブジェクトのコピーである新しい Card オブジェクトを指す、新しい shared_ptrs を含む新しいベクトルを作成します。その部分は簡単です。
その後、問題が発生します。m_ptrs のポインターを更新して、m_cards 内のカードを指すようにする必要がありますが、これは単純な作業ではありません。
これを行うために私が考えることができる唯一の方法は、マップを作成し、m_cards のコピー中に (map[oldPtr] = newPtr
を使用して) 塗りつぶし、それを使用して m_ptrs を更新することです。ただし、これはO(m * log(n))
(m = m_ptrs.size(); n = m_cards.size()
)のみです。これはかなり定期的な操作になります*ので、これを効率的に実行したいと考えており、O(m)
カスタムポインターを使用することでそれが可能になるはずだと感じています。しかし、これを行う効率的な方法を見つけることができないようです。する人はいますか?
* AI のテストベッドを作成するために使用され、さまざまな動きを「試す」ことができます
編集:まだ回答を受け入れていないので、回答を受け入れることについて少し追加したいと思います。私はこのプロジェクトに戻るまで待っています (私はこのプロジェクトにあまりにも多くの時間を割いていたので脇道に逸れました - あなたが楽しみのためにそれをするなら、それは楽しみであり続けなければなりません)、私が受け入れるまでにはもう少し時間がかかるかもしれません.答え。それにもかかわらず、私はいつか答えを受け入れるので、心配しないでください:P
編集番号 2: 私はまだこのプロジェクトに戻っていません。今のところ、O(m * log(n))
文句を言うのではなく、ただ道をたどることを考えています。しかし、私は最近自分のパターンを学ぶのに時間がかかったので、このプロジェクトをしばらくリファクタリングする必要があると考えています. ああ、それと、私が持っているすべての新しい知識を使って、この問題に取り組むことに少し時間を費やすかもしれない. 「ハッシュマップに固執して、本当に高速化する必要があるかどうかを後で確認してください」という回答がないため(私の質問に対する回答ではないため、実際にあった場合はかなりがっかりします)、私はこのプロジェクトに戻るまで、回答の選択をもう少し延期します。
編集番号 3: 私はまだこのプロジェクトに戻っていません。より正確には、それは無期限に棚上げされました。今は頭を下げすぎず、O(m * log(n))
後で問題が発生した場合は後で確認することはないと確信しています。ただし、パフォーマンスの向上を明示的に求めたので、それは私の質問に対する良い答えではありませんでした。回答をこれ以上受け入れないままにしたくないので、最も役立つ回答を選択して受け入れました。