0

たとえば、要素が複数のマップから参照されているとします。たとえば、名前から要素へのマップ、アドレスから要素へのマップ、および要素への年齢のマップなどです。たとえば名前で要素を検索し、3 つのマップすべてから要素を削除したいですか?

いくつかの解決策が思い浮かびます:

1) 最も単純明快。名前から要素へのマップで要素を検索し、他の両方のマップを検索してそれらの要素を見つけ、3 つすべての要素エントリを削除します。

2) 3 つのマップすべてにウィーク ポインターを格納します。共有ポインタをどこかに、せいぜい要素自体に保存します。1 つのマップで要素を見つけたら、その要素を削除します。他のマップから要素にアクセスしようとして、ウィーク ポインターを共有ポインターに変換できないことに気付いた場合は、エントリを削除します。

3) 侵入型マップを使用します。これには、要素を見つけるために残りのマップを検索する必要がないという利点があります。ただし、オブジェクトは複数のマップに格納されるため、要素自体を邪魔にならないようにすることはできません。むしろ、要素にはフックを実装するメンバーが必要になる場合があります。

4) その他?

これに対する非常にきれいな解決策はありますか?私はこの問題に何度かぶつかっています...

いくつかの考え。通常、ソリューション 1 は、プロジェクトが成長するにつれて自然に実装されるものです。要素自体が他のマップの重要な情報を持ち、他のコンテナーがマップである場合、これはおそらくまったく問題ありません。ただし、キーが欠落している場合、またはコンテナーがリストなどの場合、非常に遅くなる可能性があります。解決策 2 は、ウィーク ポインターの実装に依存しており、非常に遅くなる可能性もあります。解決策 3 が最善のようですが、やや複雑でしょうか?

4

3 に答える 3

0

DeleteFromMaps(bool map1, bool map2, bool map3)解決策1を置き換えるものは何も見つかりませんでした。オブジェクトの削除関数(たとえば)でshared_pointersとdeleteフラグになりました。eg map2 からの呼び出しは、eg になります。

it->DeleteFromMaps(true,false,true);
erase(it);
于 2014-05-28T20:24:53.603 に答える