考虑STL中的queue
容器。
据我了解,在<algorithm>
标头中可用的swap()
函数可以正常工作。
我了解到swap()
只会对queue
实例进行表面复制,即仅会复制front
和rear
指针以及size
和其他数据成员。
两个队列中的条目不会物理交换位置,但无论何种情况,一旦交换指针和大小,这两个队列就会被有效地交换。
std::swap
的通用实现没有选择只能进行两次复制。从概念上讲,这个过程是这样的:template <class T>
void swap(T &a, T &b)
{
T t(a);
a = b;
b = t;
}
std::swap
不知道传入对象的内部情况(因为它可以被任意用户类型调用),因此需要进行拷贝。对于容器来说,这意味着拷贝元素。swap
只需重新指向一些内部指针,因此可以极大地提高性能。template <class T>
void swap(T &a, T &b)
{
T t(::std::move(a));
a = ::std::move(b);
b = ::std::move(t);
}
std :: swap
重载。这些重载的作用是简单地在一个操作数上调用优化的swap
成员函数。这样,你既拥有通用的自由函数swap
,可以用于任何事物,又有针对标准库所知道的所有内容的优化实现。std :: swap
重载,但这意味着它们可能需要成为友元,并且可能被视为不太容易被用户代码访问。swap
可以比3次移动的std::swap
更有效率。 - MSalterslist
的。 - Angew is no longer proud of SOstd::swap
对每个容器都有重载,因此您是正确的,成员函数 swap
不是必需的。自由重载可以被声明为 friend
并执行所有实现特定、容器特定的魔法以实现高效的交换。swap
。我想这样做允许以不同的方式调用这些函数,并且节省了许多 friend
声明。
<algorithm>
获得,那么意味着STL容器可以更快地执行该功能,因为它了解数据的结构。 - Algirdas Preidžius