2012-04-30 9 views
0

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

私が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; 

}

+1

メインの 'if(a <= b);それ以外の場合はfalseを返します。 '(a> b)がfalseを返す場合、 ' – chris

+4

クラスに別の名前を付けてください。' set'は標準ライブラリコンテナです。 – juanchopanza

+2

@juanchopanza: 'set'は標準ライブラリコンテナではありません。' std :: set'はです。 – SigTerm

答えて

2

あなたの長さconparisonに似て、あなたの内側のループの比較を変更する必要があります。

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)ではありません。

+1

以上の合理化されたバージョン 'リターン<あなたのクラスのために、あなたも(もちろん、あなたがその場所が他の場所であるだけであること、そのような機能が必要であることを変更されません)を設定するコンパレータを渡すことができOPをオーバーロードする必要がいけませんstd :: lexicographical_compare(s1.arr + 1、s1.arr + s1.arr [0] +1、s2.arr + 1、s2.arr + s2.arr [0] +1); ' –

関連する問題