C++ c++;11使用std::swap vs运算符=(T&;)清除容器
在c++11中,哪种方式清除容器(例如队列)更好/更快:C++ c++;11使用std::swap vs运算符=(T&;)清除容器,c++,c++11,std,C++,C++11,Std,在c++11中,哪种方式清除容器(例如队列)更好/更快: void clean() { std::队列空_q; 标准::交换(q到q清除,空q); } 或者使用运算符=(Q&&)(比交换更快?) void clean() { q_to_clear=std::queue{}; } 或者本质上是一样的?这可能根本没有什么区别,但是移动分配要求临时源队列在从中移动后需要构建一个新的空状态,这可以通过交换避免。您可以按如下方式编写交换: std::queue<int>().swap(q_
void clean()
{
std::队列空_q;
标准::交换(q到q清除,空q);
}
或者使用运算符=(Q&&)(比交换更快?)
void clean()
{
q_to_clear=std::queue{};
}
或者本质上是一样的?这可能根本没有什么区别,但是移动分配要求临时源队列在从中移动后需要构建一个新的空状态,这可以通过交换避免。您可以按如下方式编写交换:
std::queue<int>().swap(q_to_clear);
std::queue().swap(q_到_清除);
C++11
-极端化:
decltype(q_to_clear)().swap(q_to_clear);
也适用于其他std::
容器
紧凑型内存语法与以下一样酷:
decltype(q_to_compact)(q_to_compact).swap(q_to_compact);
紧凑型内存版本的用途是什么。。。啊,你把
q_复制到了_compact
。{}
会更清楚地说明这一点,还是您害怕初始值设定项列表问题?@Yakk-这是为了释放过度分配的内存。std::vector
的默认分配策略是在容量耗尽时将容量增加x2,因此可能会浪费一半的内存。因此,您可以从现有向量创建一个临时向量(该向量的容量将与大小完全匹配),将其与要压缩的向量交换,并使其超出范围。”…移动分配要求临时源队列需要构建一个新的空状态“嗯。。。实际上,移动分配不需要这样做。从容器中移出的容器不保证/不要求变为空。
decltype(q_to_clear)().swap(q_to_clear);
decltype(q_to_compact)(q_to_compact).swap(q_to_compact);