清除std::list
和std::set
的最佳,最快和最可靠的方法是什么?在C++中清除容器的最佳方式是什么?
// 1st
list.clear();
set.clear();
// 2nd
list = {};
set = {};
// 3rd
list.swap(std::list<some_type>{});
set.swap(std::set<some_type>{});
清除std::list
和std::set
的最佳,最快和最可靠的方法是什么?在C++中清除容器的最佳方式是什么?
// 1st
list.clear();
set.clear();
// 2nd
list = {};
set = {};
// 3rd
list.swap(std::list<some_type>{});
set.swap(std::set<some_type>{});
所有这些选项将是大致相同的性能(与clear
版本需要一点比其他两种操作较少,但性能损失很可能是不可量化),但版本(1)container.clear
是最清楚的(就代码可读性而言),所以我会一起去。
值得注意的是,list.swap(std::list<some_type>{});
是一个编译错误,因为std::list::swap
没有右值引用的重载,并且只接受非常量左值引用。同上std::set::swap
。你必须创建一个指定的临时对象并与之交换。
你为什么说他们会有相同的表现? –
@NeilButterworth,因为他们会做同样的事情。他们将调用容器中所有对象的析构函数并释放分配的内存。 – SergeyA
但不是这样,'list.swap(std :: list
这三者同样“可靠”。
与.clear()
的版本显然是最清晰的。 :)
尽管如此,使用为该任务命名的功能以及专门为该任务添加的功能。这里不需要神秘的“技巧”。编写自我记录代码。
因为黑羊'std :: vector',我很好奇:) –
您的示例是否有两个基于节点的容器是巧合吗?因为对于'std :: vector',所显示的操作的语义不同。如果您已经意识到这一点,也许会提到这个问题。 – 5gon12eder
我已经知道了'std :: vector swap trick',因为我有一个内部使用这两种数据结构的类,所以我很好奇。 –
只需从现代编译器的优化构建中查看生成的asm,即可获得答案 - 5分钟的工作台面。 –