内部で動的に割り当てられた配列であり、必要なオーバーロードされた演算子を持つコンテナーとして機能する 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;
}