c ++ 11使用std :: swap vs operator =(T&&)清除容器

时间:2014-02-01 20:00:31

标签: c++ c++11 std

在c ++ 11中以哪种方式更好/更快地清除容器(例如队列):

void clean()
{
   std::queue<int> empty_q;
   std::swap(q_to_clear, empty_q);
}

或使用operator =(Q&amp;&amp;)(比交换更快?)

void clean ()
{
    q_to_clear = std::queue<int>{};
}

或者它基本上是一样的吗?

2 个答案:

答案 0 :(得分:4)

它可能几乎没有任何区别,但移动分配要求临时源队列在移动后需要建立一个新的空状态,这可以避免交换。您可以按如下方式编写交换:

std::queue<int>().swap(q_to_clear);

答案 1 :(得分:2)

C++11 - 提升至极端:

decltype(q_to_clear)().swap(q_to_clear);

也适用于其他std::容器。

紧凑内存语法一样酷:

decltype(q_to_compact)(q_to_compact).swap(q_to_compact);