::std:multiset
を保存している理由GraphObject *
は少しわかりにくいですが、それでロールバックしましょう。
これは、ドキュメントで本当に簡単に答えられる答えですが、StackOverflowにとってあまりにも愚かな質問はないので...
the_Map = new map<string,multiset<GraphObject*>>;
それが実際に、マップにメモリを割り当てる方法です。周りにあるものへの裸のポインタを持つことは一般的に良い考えではありませんが、あなたは主張しました、そしてそれがあなたのやり方です. delete
それは、ある時点でそれを覚えておく必要があることを意味します。そして、ポインターを保持するクラスのコピー構造が正しいことを行うことを確認する必要があります (正しいことはかなり複雑になります)。
あなたは今、興味深い問題を抱えています。multiset
各マップ エントリにを格納しています。幸いなことに、このマルチセットは自動的に作成され、未知のキーがアクセスされると空に初期化されます。OTOH、ベアポインターの使用は、例外の安全性の問題があることを意味します。途中で例外がスローされると、メモリ リークが発生する可能性があります。したがって、例外をキャッチしてオブジェクトをクリーンアップする必要があります。
GraphObject *tmp = new GraphObject;
try {
(*the_Map)[key].insert(tmp);
} catch (...) {
delete tmp;
throw;
}
あなたの質問が非常に基本的なものであるという事実は、ポインターを使用する必要があるというあなたの主張に疑問を投げかけます. そして、 from ->multimap
ではなくa を使用したくないのではないかと本当に思います。ただし、データ構造の一般的な形式については固執しています。以上が使用方法になります。map
string
multiset
また、このデータ構造で生のポインターを大量に使用することは、かなり悪い考えだとも言います。混乱全体を適切に分解またはコピーするには、かなり洗練された関数を作成する必要があります。
編集:ため息午前 4 時に自分で作成したことのないデータ構造をコーディングすると、非常にばかげたコードを書くことになりました。現在のバージョンははるかに優れています。この答えは私のものよりもはるかに優れていますが。