2017-01-23 102 views
0

清除std::liststd::set的最佳,最快和最可靠的方法是什么?在C++中清除容器的最佳方式是什么?

// 1st 
list.clear(); 
set.clear(); 

// 2nd 
list = {}; 
set = {}; 

// 3rd 
list.swap(std::list<some_type>{}); 
set.swap(std::set<some_type>{}); 
+0

您的示例是否有两个基于节点的容器是巧合吗?因为对于'std :: vector',所显示的操作的语义不同。如果您已经意识到这一点,也许会提到这个问题。 – 5gon12eder

+0

我已经知道了'std :: vector swap trick',因为我有一个内部使用这两种数据结构的类,所以我很好奇。 –

+0

只需从现代编译器的优化构建中查看生成的asm,即可获得答案 - 5分钟的工作台面。 –

回答

5

所有这些选项将是大致相同的性能(与clear版本需要一点比其他两种操作较少,但性能损失很可能是不可量化),但版本(1)container.clear是最清楚的(就代码可读性而言),所以我会一起去。

值得注意的是,list.swap(std::list<some_type>{});是一个编译错误,因为std::list::swap没有右值引用的重载,并且只接受非常量左值引用。同上std::set::swap。你必须创建一个指定的临时对象并与之交换。

+1

你为什么说他们会有相同的表现? –

+1

@NeilButterworth,因为他们会做同样的事情。他们将调用容器中所有对象的析构函数并释放分配的内存。 – SergeyA

+1

但不是这样,'list.swap(std :: list {});'构造一个新的无名对象? –

2

这三者同样“可靠”。

.clear()的版本显然是最清晰的。 :)

尽管如此,使用为该任务命名的功能以及专门为该任务添加的功能。这里不需要神秘的“技巧”。编写自我记录代码。

+0

因为黑羊'std :: vector',我很好奇:) –

相关问题