问题是在数据集中找到周期性图形模式。所以我在每个时间步长中有1000个时间步长和一个图形(编码为整数)。因此,有999个可能的时间段可以出现图表。我还定义了一个定义为(timestep mod period)的相位偏移。对于在第5个时间段中首次出现的具有周期2的图表,相位偏移为1.
我试图用C ++创建一个二维的列表数组。每个单元格包含一个包含具有指定周期和相位偏移的图形的列表。我一直在相应的列表中插入图表。
list<ListNode> A[timesteps][phase offsets]
ListNode
是一个包含4个整数变量的类。
这给了我分段错误。使用500的大小运行正常。这是由于缺乏记忆还是其他一些问题?
感谢。
答案 0 :(得分:6)
可能是由于堆栈尺寸有限。
你正在创建一个1000x1000 = 1000000个对象的数组,几乎可以肯定每个至少4个字节,所以至少大约4兆字节。假设它在函数内部,它将是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);
答案 1 :(得分:1)
在32位系统上的libstdc ++中,std :: list对象weights 8 bytes(只有对象本身,不计算它可能产生的分配),甚至在其他实现中我认为它不会太多不同;所以,你在普通计算机上分配大约8 MB的数据,这本身并不多本身,但是,如果你把这个声明放在一个函数中,它将是一个局部变量,因此被分配在堆栈上,它的大小非常有限(最多几MB)。
你应该在堆上分配那个东西,例如使用new
,或者更好地使用std::vector
。
顺便说一下,你需要一个1000x1000的std::list
数组似乎不对,你能准确指出你想要实现的目标吗?可能有更适合您需求的数据结构。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
您宣布[1000]
的二维数组[1000]
x list<ListNode>
。我认为这不是你想要的。
分段错误可能是因为尝试使用列表中无效的元素。