stl :: list对象的最大数量

时间:2012-12-01 02:57:54

标签: c++ stl

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

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

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

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

这给了我分段错误。使用500的大小运行正常。这是由于缺乏记忆还是其他一些问题?

感谢。

4 个答案:

答案 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>。我认为这不是你想要的。

分段错误可能是因为尝试使用列表中无效的元素。