std::mapコンテナのカスタムコンパレータを定義しようとしています。
問題は、==および!=演算子で中継できるか、それとも厳密な弱順序を破ることができるかということです。演算子<を使用する必要がありますか?
(1つと2つのクラスにはoperator!=とoperator ==が正しく定義されています)
typedef std::pair<One, Two> MapKey_t;
class cmp
{
bool operator()(const MapKey_t& left, const MapKey_t& right) const
{ return left.first != right.first && right.first == right.second; }
}
typedef std::map<MapKey_t, Three*, cmp> MyMap_t;
左から右に切り替えてもコンパレータの戻り値は変わらないので、これは機能しますか?
アイテムがどのようにコンテナに分類されるかはあまり気にしませんが、重複をコンテナの一部にしたくありません。
更新:
メモリアドレスを使用して厳密な弱順序を取得できますか?
class cmp
{
bool operator()(const MapKey_t& left, const MapKey_t& right) const
{
if(left.first == right.first)
if(left.second != right.second)
return false; // This represents for me, functionally, a duplicate
else
// Can't use operator < there since left.second equals right.second but
// functionally for me, this is not a duplicate and should be stored
// what about memory address strict weak ordering ?
return &left < &right;
else
return left.first < right.first; // There I can use operator <
}