提问人:Dhruv Joshi 提问时间:10/9/2020 更新时间:10/9/2020 访问量:674
为什么以及何时使用 clear()
Why and when to use clear()
问:
据此,clear() 将销毁所有对象,但不会释放内存。此外,当我遇到删除集合的所有元素的必要性时,我发现 set.clear() 的时间复杂度在大小(破坏)上是线性的,而对于 set.swap() 来说是常数。(删除矢量的所有元素时出现同样的问题)
那么在这种情况下,我们不是应该尽可能使用带有空 STL 容器的 swap() 吗? 因此,clear() 与空容器交换的需求和好处是什么?
对不起,如果这看起来微不足道,但我找不到任何关于此的内容。 谢谢!
答:
的时间复杂度是恒定的,是的。swap()
据推测,您正在考虑与一个很快就会超出范围的局部变量进行交换。如果是这种情况,则在局部变量超出范围时调用析构函数,并且该析构函数的时间复杂度在大小上是线性的,与本来的相同。因此,没有性能优势,并且您付出了可读性较低的代码的代价。clear()
当然,调用会更快,但除非你有无限的空容器可用,否则最终你将不得不对你交换()的物品的容器做一些事情,在这种情况下,你又回到了线性时间内销毁物品。swap()
不过,这并不意味着这个技巧没有用——例如,如果你有一个具有实时线程和非实时线程的程序,你可以将容器放在实时线程中,并将其留给非实时线程来执行实际的 /items-destruction,这样实时线程就不必花费有限的时间来销毁项目。swap()
swap()
clear()
何时使用 clear()
当您想要删除容器的所有元素时。
为什么使用 clear()
因为这是实现上述目标的最清晰、最有效的方法。
clear() 将销毁所有对象,但不会释放内存。
这是一个理想的功能。它允许快速,并允许快速将新元素添加到容器中,因为内存已经分配。clear
如果要释放内存 - 知道如果插入新元素,则需要再次为分配付费,可以使用 .shrink_to_fit
我发现 set.clear() 的时间复杂度在大小(破坏)上是线性的,而 set.swap() 的时间复杂度是常数。
你忘记了以前是空的,现在是完整的集合最终必须被摧毁。猜猜集合的析构函数的复杂度是多少。
它的大小是线性的。
那么在这种情况下,我们不是应该尽可能使用带有空 STL 容器的 swap() 吗?
Swap 引入了额外的不必要的操作,这些操作不起作用,因此效率不高。此外,它没有清楚地表达意图。clear
在一般情况下,用掉期代替 clear 没有优势。
在极少数情况下,与空容器交换确实有其用途。例如,如果需要清除关键部分内的容器,则稍后交换并保留元素的销毁可以减小该关键部分的大小。
评论
vector
shrink_to_fit
shrink_to_fit