3

私は概念的に次のような構造を持っています

class C {/* expensive class */};
struct mapping {
    std::map<std::pair<C,C>, C> the_map;
};

これは、C の多数のコピーが格納されることになるため、理想的とは言えません。私の現在の解決策は、C のセットを作成し、ポインター (またはイテレーター) をマップに格納することです。

struct mapping {
    std::set<C> all_Cs;
    std::map<std::pair<C*, C*>, C*> the_map;
};

the_map は常に all_Cs の前に破棄され、すべてのポインターが有効になるため、これは安全です。

コピー施工はセットをコピーしてマップを再構築することでできますが、ムーブ施工を効率的に実施することはできますか?

私が理解していることから、同じアロケーターを使用してセットを移動することは、実装がセット内のオブジェクトへのポインターの有効性を維持することを強制する一定の操作である必要がありますが、標準でこれをバックアップするものを見つけることができません. これを使用すると、セットとマップの両方を移動するだけでムーブ コンストラクターを実装でき、すべてのポインターが新しいオブジェクトによって正しく所有されます。

これは正しい推論であり、移植可能な方法でこの動作に依存できますか?

4

1 に答える 1