2

問題は、データセット内の周期的なグラフパターンを見つけることです。したがって、各タイムステップにグラフ(整数としてエンコード)を含む1000のタイムステップがあります。したがって、グラフが発生する可能性のある期間は999あります。また、(timestep mod period)として定義される位相オフセットを定義します。周期2の5番目のタイムステップで最初に見られたグラフの場合、位相オフセットは1です。

C++でリストの2次元配列を作成しようとしています。各セルには、指定された周期と位相オフセットを持つグラフを含むリストが含まれています。対応するリストにグラフを挿入し続けます。

list<ListNode> A[timesteps][phase offsets]

ListNode4つの整数変数を持つクラスです。

これにより、セグメンテーション違反が発生します。サイズに500を使用すると問題ありません。これはメモリ不足またはその他の問題によるものですか?

ありがとう。

4

4 に答える 4

6

おそらくスタックサイズが制限されているためです。

1000x1000 = 1000000オブジェクトの配列を作成しています。これは、ほぼ確実に1つあたり少なくとも4バイトであるため、少なくとも約4メガバイトです。それが関数内にあると仮定すると、それはautoストレージクラスになります。これは通常、スタックに割り当てられることを意味します。一般的なスタックサイズは約1〜4メガバイトです。

次のようなものを試してくださいstd::vector<ListNode> A(1000*1000);(必要に応じて、2次元に見えるようにラッパーを作成します)。

編集:ラッパーは、2Dアドレス指定を提供するためにオペレーターをオーバーロードします:

template <class T>
class array_2D { 
    std::vector<T> data;
    size_t cols;
public:
    array_2D(size_t x, size_t y) : cols(x), data(x*y) {}

    T &operator()(size_t x, size_t y) { return data[y*cols+x]; }
};

あなたはそれを装飾したいかもしれませんが(例えば、境界チェックで)、それは一般的な考えです。それに対処するには、次のようにを使用()します。

array_2d<int> x(1000, 1000);

x(100, 3) = 2;

y = x(20, 20);
于 2012-12-01T03:04:05.957 に答える
1

32ビットシステムのlibstdc++では、std :: listオブジェクトの重みは8バイト(オブジェクト自体のみで、割り当てはカウントされません)であり、他の実装でもそれほど違いはないと思います。したがって、通常のコンピューターではそれ自体はそれほど多くない約8 MBのデータを割り当てますが、その宣言を関数に入れると、ローカル変数になり、スタックに割り当てられます。これはかなりの量です。サイズに制限があります(最大で数MB)。

そのことをヒープに割り当てる必要があります。たとえば、を使用newするか、またはを使用することをお勧めしますstd::vector

ちなみに、1000x1000の配列が必要なのは正しくないようですがstd::list、達成しようとしていることを正確に指定できますか?おそらく、ニーズにより適したデータ構造があります。

于 2012-12-01T03:06:08.267 に答える
1

スタックスペースが不足しているようです。ヒープなどに割り当てて、クラッシュするのではなくstd::vector、ラップインtry ... catchしてメモリ不足エラーを確認してください。

std::array(編集:スタックにも割り当てられるため、使用しないでください。)

try {
   std::vector<std::list<ListNode> > a(1000000);   // create 1000*1000 lists
   // index a by e.g. [index1 * 1000 + index2]
   a[42 * 1000 + 18].size(); // size of that list

   // or if you really want double subscripting without a wrapper function:
   std::vector<std::vector<std::list<ListNode> > > a(1000);
   for (size_t i = 0; i < 1000; ++i) {   // do 1000 times:
       a[i].resize(1000);                // default-create and create 1000 in each
   }
   a[42][18].size(); // size of that list

} catch (std::exception const& e) {
    std::cerr << "Caught " << typeid(e).name() << ": " << e.what() << std::endl;
}
于 2012-12-01T03:18:27.617 に答える
0

の2次元配列[1000]x[1000]を宣言していますlist<ListNode>。それはあなたが意図したことではないと思います。

セグメンテーション違反は、リストの無効な要素を使用しようとしたことが原因である可能性があります。

于 2012-12-01T03:04:14.013 に答える