最大数量 stl::list 对象
Maximum number of stl::list objects
问题是在数据集中找到周期图模式。所以我有 1000 个时间步,每个时间步都有一个图形(编码为整数)。因此,图形可以发生 999 个可能的周期。我还定义了一个定义为(时间步长修改周期)的相位偏移。对于在第 5 个时间步长中首次看到的周期为 2 的图形,相位偏移为 1。
我正在尝试在C++中创建二维列表数组。每个单元格包含一个列表,其中包含具有指定周期和相位偏移的图形。我一直在相应的列表中插入图表。
list<ListNode> A[timesteps][phase offsets]
ListNode
是一个具有 4 个整数变量的类。
这给了我分段错误。使用 500 作为大小运行良好。这是由于内存不足还是其他问题?
谢谢。
可能是由于堆栈大小有限。
您正在创建一个包含 1000x1000 = 1000000 个对象的数组,几乎可以肯定每个对象至少为 4 个字节,因此至少大约为 4 MB。假设它位于函数内部,它将auto
存储类,通常转换为在堆栈上分配。典型的堆栈大小约为 1 到 4 MB。
尝试类似这样的操作: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);
听起来您的堆栈空间不足。尝试将其分配给堆上,例如通过 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;
}
在 32 位系统上的 libstdc++ 中,std::list 对象的权重为 8 个字节(仅对象本身,不包括它可能进行的分配),即使在其他实现中,我认为也不会有太大不同; 因此,您正在分配大约 8 MB 的数据,这在普通计算机上本身并不多, 但是,如果您将该声明放在函数中,它将是一个局部变量,因此在堆栈上分配,其大小非常有限(最多几 MB)。
您应该在堆上分配该东西,例如使用 new
,或者更好地使用 std::vector
。
顺便说一句,您需要一个 1000x1000 的std::list
数组似乎不对,您能准确指定您要实现的目标吗?可能有一些数据结构更适合您的需求。
您正在声明一个二维数组[1000]
x [1000]
的list<ListNode>
。我不认为这是你的意图。
分段错误可能是由于尝试使用无效的列表元素。
- 使用"std::unordereded_map"映射到"std::list"对象
- std::list 中的迭代器感知对象
- C++ - 使用 std::list,如何打印对象的私有成员的链接列表?
- pybind 如何对 py::list 对象进行操作
- 如何通过存储在 std::list 中的指针删除对象?
- std::list::merge() 对于包含对象的列表失败
- 最大数量 stl::list 对象
- 从 std::list 中删除对象
- C++ - 错误:'list'没有命名类型(将对象列为类中的成员变量)
- 使用 std::list 和对象指针
- 将派生类的对象保存在基 c 的 std::list 中
- 在std::list中就地创建自定义类型对象
- 通过 BaseClass List 调用派生类对象的析构函数
- 如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序
- 为什么<list>元素会在使用 malloc() 内存的对象中导致分割错误
- 无法理解如何将新对象添加到 std::list<std::unique_ptr<classname>>
- 钩住std::list中的对象.指针或迭代器
- 无法在 qml 中创建C++类对象"Cannot assign object to list property "数据" "
- 如何在不'new'的情况下将新的对象实例添加到 std::list
- 替换给定迭代器的std::list对象