我有一个定义如下的列表:
std::list<int *> m_ilist;
然后我将 int
添加到列表中:
m_ilist.push_back (new int (x));
我想破坏 vector 并删除为每个元素分配的内存。
哪个更好:
循环遍历列表,对每个迭代器调用删除。调用clear()之后:
for (...) { delete *it; } m_ilist.clear ();
执行循环但在迭代器上调用删除:
for (...) { delete *it; m_ilist.erase (); }
更好被定义为更快/更快/更少的处理。
谢谢。
最佳答案
对其进行基准测试。更重要的是,在您的特定应用程序中对其进行基准测试。当您的里程将变化时,我们测试两个版本的综合运行时是没有意义的,这取决于您之后所做的事情。
瓶颈在于幕后发生的令人讨厌的释放和内存分配。根据程序其余部分所展示的内存分配模式,您很可能会得到不同的结果。
话虽如此;差异很可能可以忽略不计,因此我的直觉告诉我,如果有疑问,请进行第二次循环并保存一个循环。编辑:请注意,如果您确实关心速度,请使用 std::vector<int>
而不是std::list<int*>
。差异将明显大于您列出的选项之间的差异。
编辑 2:如果您使用 std::vector
确保使用变体 1(使用 clear
而不是许多 erase
)。在这种情况下,它确实会产生巨大的差异。如果元素确实很大(而不是 int
),您可能需要实际将指针(或智能指针)放入 vector 中以最小化复制开销。
关于c++ - 清除 std::list 动态对象的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9408644/