0

キーがペアで、カスタム コンパレータがそのペアの最初の要素に対して単一性を保証するマップがあるとします。

class comparator 
{
    public:
        bool operator()(const std::pair<std::string, std::int>& left,
                        const std::pair<std::string, std::int>& right) 
        { 
            return left.first < right.first;
        }
};

std::map<std::pair<std::string, std::int>, foo, comparator>;

可能であれば、このマップをそれよりもインテリジェントにしたいと考えています。
ペアの最初の要素と同じ文字列を持つキーが既に存在する場合に挿入時に拒否される代わりに、ペアの整数 (.second) が「おそらく挿入された要素」が大きくなります。

もちろん、キーのマップを調べてキーの詳細を取得し、必要に応じて上書きすることでこれを行うことができます。別の方法として、マルチマップを使用した挿入後のアプローチを採用することもできます。その上で、反復して重複をクリーンアップし、最大のペア整数を持つキーだけを保持します。

問題は、stl 実装 ([] 演算子 - 挿入メソッド) の一部をオーバーライドするか、カスタム コンパレータを改善してから、単にマップの挿入メソッドに依存することで、それをネイティブに実行できるかどうかです。

これが受け入れられるかどうかはわかりませんが、特定の状況下で既に保存されている (キー、値) ペアを更新できる非 const コンプレーターがあると想像できます。

4

1 に答える 1

1

価値あなたの質問に対する答えは、あなたにはできないということです。提案された実装には 2 つの問題があります。

  1. キーはマップのインデックスであるため、const のままにする必要があります。
  2. コンパレーターが比較している要素に対して行ったこととは無関係に、コンパレーターの戻り値に基づいてstd::map前または後にアイテムを挿入しますleft

問題の解決策は、@MvG によって提案されているとおりです。キーをペアにする必要はありません。ペアにする必要があるのは値です。

これには、カスタム コンパレータが必要ないという追加の利点があります。

問題は、カスタム インサータが必要になることです。

std::pair< int, foo >& tempValue = _myMap[ keyToInsert ];
if( valueToInsert.first >= tempValue.first )
{
    tempValue = valueToInsert;
}

valueToInsert.firstこれは、使用するすべての s が正の場合にのみ機能することに注意してください。これにより、 an のデフォルトのコンストラクターintが 0 になります。負valueToInsert.firstの s がある場合、要素の代わりにデフォルトで構築された値のペアが挿入されます。

于 2013-09-25T11:59:53.667 に答える