3

3 つの整数の組み合わせによって一意に識別されるデータがあります。

例:
アイテム #1: 10,20,1
アイテム #2: 10,21,0
アイテム #3: 0,14,13
アイテム #4: 103,324,78

私の構造:

struct structureKeyID
{
    int keyA;
    int keyB;
    int keyC;

    // Comparison operator for table sorting.
    bool operator<(const structureKeyID& param) const
    {
        if (keyA < param.keyA) return true;
        if (keyB < param.keyB) return true;
        if (keyC < param.keyC) return true;
        return false;
    }
};

map <structureKeyID, classDataRecord> tableRecords;

キー (0,0,1) を追加すると、次のことがわかりました。

structureKeyID keyID1;
keyID1.keyA = 0;
keyID1.keyB = 0;
keyID1.keyC = 1;
tableRecords[keyID1] = <data>;

次に、キー (0,1,0) が存在するかどうかを確認します。

structureKeyID keyID2;
keyID1.keyA = 0;
keyID1.keyB = 1;
keyID1.keyC = 0;
if (tableRecords.find(keyID2) != tableRecords.end())

次に、エラーが発生します。

デバッグ アサーションに失敗しました!
\include\xtree 行: 1268
式: 無効な演算子

一方、キー (0,0,2) またはキー (10,0,2) が存在するかどうかを確認すると、正常に動作します。

この状況で比較演算子を作成する適切な方法は何ですか?

どうもありがとうございました!

4

2 に答える 2

8

厳密な弱い順序付けを満たす小なり比較の最も簡単な実装は、ヘッダーstd::tieで使用できるwith です。<tuple>

bool operator<(const structureKeyID& param) const
{
  return std::tie(keyA, keyB, keyC) < std::tie(param.keyA, param.keyB, param.keyC);
}

これは、辞書式比較を実行します。C++11 のサポートがない場合は、TR1 と Boost で同等のものを見つけることができます。

于 2013-05-03T15:19:32.600 に答える
6

これを試して

// Comparison operator for table sorting.
bool operator<(const structureKeyID& param) const
{
    if (keyA < param.keyA) return true;
    if (keyA > param.keyA) return false;
    if (keyB < param.keyB) return true;
    if (keyB > param.keyB) return false;
    if (keyC < param.keyC) return true;
    if (keyC > param.keyC) return false;
    return false;
}

あなたのバージョンは一貫した順序付けを定義していません (専門用語は厳密な弱い順序付けです)。比較関数では A < B < C < A になる可能性があるためstd::map、混乱します。

于 2013-05-03T15:15:45.287 に答える