0

stl セットに 650 万を少し超える要素 (int) を挿入しようとしています。コードは次のとおりです。

set<int> s;
cout << s.max_size() << endl;
for(int i = 0; i < T.MULT * T.MAXP; i++) {
    s.insert(a[i]);
}

T.MULTです10T.MAXPです666013

aint a[T.MULT * T.MAXP];は、個別の要素を含む配列 - 静的に割り当てられた ( ) です。

約 460 万の要素の後、例外s.insert()がスローされます。bad_allocWindows 7 で利用できるリソース モニターでは、空きメモリが 3 GB 残っていると表示されます。私は何を間違っていますか?STL セットがメモリを割り当てられないのはなぜですか?

編集: 完全なコードは次のとおりです: http://ideone.com/rdrEnt

Edit2: 明らかに、挿入された要素は結局区別できないかもしれませんが、それは問題ではありません。

Edit3: これはコードの簡略版です: http://ideone.com/dTp0fZ

4

3 に答える 3

3

実際の問題は、配列 A に 650 万を超える要素を静的に割り当てたため、プログラムのスタック スペースが破損したことにあります。配列をヒープに割り当てると、実際に機能します。あなたの説明に基づいてコードを変更しましたが、うまくいきました。

int *A = new int[T.MULT * T.MAXP];
for (int i= 0; i <  T.MULT * T.MAXP; ++i)
{
    A[i] = i; //for simplicity purpose, your array may have different elem. values
}

set<int> s;
for (int i = 0; i <  T.MULT * T.MAXP; ++i )
{
    s.insert(A[i]);
}

cout << s.size();

set<int>::iterator iter;
int count = 0;
for (iter = s.begin(); iter != s.end(); ++ iter)
{
    cout << *iter << " ";
    count ++;
    if (count == 100)
    {
        cout <<endl;
        count = 0;
    }
}

delete [] A;

return 0;

ベクトルとセットの両方で完全に機能しました。660 万個の要素をすべて画面に表示できます。

他の投稿が示しているように、興味があれば STXXL も試してみてください。

于 2013-03-18T13:43:11.860 に答える
1

STXXLをご覧になることをお勧めします。

于 2013-03-18T13:24:10.613 に答える
1

あなたの質問に直接答えることはできませんが、データを std::vector に保存し、並べ替えてから、 std::binary_search を使用してアイテムの存在をテストする方が効率的だと思います。std::set のストレージは、std::vector のストレージに比べて比較的高価です。これは、各要素を格納するときにオーバーヘッドが発生するためです。

例として、これを行う方法を次に示します。これにより、静的配列がソートされます。

std::sort(a,a+(T.MULT*T.MAXP));
bool existence=std::binary_search(a,a+(T.MULT*T.MAXP),3);

速くて簡単。

于 2013-03-18T13:21:42.890 に答える