为什么以及何时使用 clear()

Why and when to use clear()

提问人:Dhruv Joshi 提问时间:10/9/2020 更新时间:10/9/2020 访问量:674

问:

,clear() 将销毁所有对象,但不会释放内存。此外,当我遇到删除集合的所有元素的必要性时,我发现 set.clear() 的时间复杂度在大小(破坏)上是线性的,对于 set.swap() 来说是常数。(删除矢量的所有元素时出现同样的问题)

那么在这种情况下,我们不是应该尽可能使用带有空 STL 容器的 swap() 吗? 因此,clear() 与空容器交换的需求和好处是什么?

对不起,如果这看起来微不足道,但我找不到任何关于此的内容。 谢谢!

C++ 向量 std 交换

评论

3赞 user4581301 10/9/2020
有时(通常是在我的情况下)您清理容器并立即开始再次填充它。如果释放内存,则会重新进行动态分配和重新分配。呸。
1赞 chris 10/9/2020
值得注意的是,has ,这比用空容器交换的成语要清楚得多。这个成语来自这个函数存在之前的时代,但它已经存在了整整 9 年。vectorshrink_to_fit
0赞 user4581301 10/9/2020
这样做的好处是,如果编译器可以看到保留内存的好处,则允许它忽略您。不幸的是,它也被允许无缘无故地忽略你,所以要确保你的标准库实现给出你想要的结果。shrink_to_fit

答:

3赞 JaMiT 10/9/2020 #1

的时间复杂度是恒定的,是的。swap()

据推测,您正在考虑与一个很快就会超出范围的局部变量进行交换。如果是这种情况,则在局部变量超出范围时调用析构函数,并且该析构函数的时间复杂度在大小上是线性的,与本来的相同。因此,没有性能优势,并且您付出了可读性较低的代码的代价。clear()

3赞 Jeremy Friesner 10/9/2020 #2

当然,调用会更快,但除非你有无限的空容器可用,否则最终你将不得不对你交换()的物品的容器做一些事情,在这种情况下,你又回到了线性时间内销毁物品。swap()

不过,这并不意味着这个技巧没有用——例如,如果你有一个具有实时线程和非实时线程的程序,你可以将容器放在实时线程中,并将其留给非实时线程来执行实际的 /items-destruction,这样实时线程就不必花费有限的时间来销毁项目。swap()swap()clear()

4赞 eerorika 10/9/2020 #3

何时使用 clear()

当您想要删除容器的所有元素时。

为什么使用 clear()

因为这是实现上述目标的最清晰、最有效的方法。

clear() 将销毁所有对象,但不会释放内存。

这是一个理想的功能。它允许快速,并允许快速将新元素添加到容器中,因为内存已经分配。clear

如果要释放内存 - 知道如果插入新元素,则需要再次为分配付费,可以使用 .shrink_to_fit

我发现 set.clear() 的时间复杂度在大小(破坏)上是线性的,而 set.swap() 的时间复杂度是常数。

你忘记了以前是空的,现在是完整的集合最终必须被摧毁。猜猜集合的析构函数的复杂度是多少。

它的大小是线性的。

那么在这种情况下,我们不是应该尽可能使用带有空 STL 容器的 swap() 吗?

Swap 引入了额外的不必要的操作,这些操作不起作用,因此效率不高。此外,它没有清楚地表达意图。clear

在一般情况下,用掉期代替 clear 没有优势。


在极少数情况下,与空容器交换确实有其用途。例如,如果需要清除关键部分内的容器,则稍后交换并保留元素的销毁可以减小该关键部分的大小。