2

问题是在数据集中找到周期性图形模式。所以我有 1000 个时间步,每个时间步都有一个图形(编码为整数)。因此,有 999 个可能的时期可以出现该图。我还定义了一个相位偏移,定义为(timestep mod period)。对于在第 5 个时间步中首次看到的第 2 个周期的图形,相位偏移为 1。

我正在尝试在 C++ 中创建一个二维列表数组。每个单元格包含一个列表,其中包含具有指定周期和相位偏移的图形。我一直在相应的列表中插入图表。

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

ListNode是一个有 4 个整数变量的类。

这给了我分段错误。使用 500 作为大小运行良好。这是因为内存不足还是其他问题?

谢谢。

4

4 回答 4

6

可能是由于堆栈大小有限。

您正在创建一个由 1000x1000 = 1000000 个对象组成的数组,几乎可以肯定每个对象至少有 4 个字节,因此至少大约 4 MB。假设它在函数内部,它将是auto存储类,通常转换为在堆栈上分配。典型的堆栈大小约为 1 到 4 兆字节。

尝试类似:(std::vector<ListNode> A(1000*1000);并且,如有必要,创建一个包装器以使其看起来是二维的)。

编辑:包装器会重载一个运算符,为您提供 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

听起来你的堆栈空间用完了。尝试在堆上分配它,例如 through 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

您正在声明一个二维数组[1000]x [1000]list<ListNode>我不认为那是你的本意。

分段错误可能是由于尝试使用无效的列表元素造成的。

于 2012-12-01T03:04:14.013 回答