0

内部で動的に割り当てられた配列であり、必要なオーバーロードされた演算子を持つコンテナーとして機能する set というクラスがあります。この配列 (1D) には、セット全体がこの配列に挿入されたときに std::sort でソートする (std::set を使用するよりもはるかに高速である) 整数の数 (天文学的に大きい場合もあります) が格納されます。これらのセットは std::map に入れられ、そこで double のキーとして機能します。これは、std::map に既にセットがあり、現在のセットが std::map コンテナーにない場合は挿入されます。カウンター「0」で。std::map が必要なので、 operator< をオーバーロードしようとしました。しかし、それはセグメンテーション違反を引き起こします。配列の最初のメンバー (arr という名前) は、セット内の整数の数を格納します。つまり、配列の合計の長さは arr[0]+1 です。

ベクトルまたは新しい配列タイプを使用しない理由は、RAM (64GB) がすぐに使い果たされるためです。これらのセットは、ピーク時 (サブセットの生成) でサイズが 2^10 から 2^11 になるため、独自のものを作成したいと考えています。スペースのオーバーヘッドが最小のベクトルのバージョン。

bool operator<(const set& s1, const set& s2)
{
    if (s1.arr[0] < s2.arr[0])
        return true;
    else if (s1.arr[0] > s2.arr[0])
        return false;

    if (s1.arr[0] == s2.arr[0])
    {
        for (int i = 1; i < s1.arr[0]+1; i++)
        {
            if (s1.arr[i] > s2.arr[i]) return false;
        }
    }
    return true;

}

4

1 に答える 1

2

長さの比較と同様に、内部ループの比較を変更する必要があります。

    for (int i = 1; i < s1.arr[0]+1; i++)
    {
        if (s1.arr[i] < s2.arr[i])
            return true;
        else if (s1.arr[i] > s2.arr[i])
            return false;
    }

そうすれば、比較演算子は厳密な弱い順序付けを実装します。たとえば、元の(2 0 2)演算子はありませんでした。(2 1 1)(2 1 1)(2 0 3)(2 0 2) < (2 0 3)

于 2012-04-30T12:07:47.113 に答える