STL中的swap函数是如何实现的?是不是就这么简单:
template<typename T> void swap(T& t1, T& t2) {
T tmp(t1);
t1=t2;
t2=tmp;
}
在其他帖子中,他们讨论了为您自己的类专门化此功能。我为什么需要这样做?为什么我不能使用std::swap
功能?
How is std::swap
实施的?
是的,问题中提出的实现是经典的 C++03 实现。
更现代的 (C++11) 实现std::swap
看起来像这样:
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // or T temp(std::move(t1));
t1 = std::move(t2);
t2 = std::move(temp);
}
这是在资源管理方面对经典 C++03 实现的改进,因为它可以防止不需要的副本等。它是 C++11std::swap,需要类型T
to be 移动可构造 and 可移动分配,从而允许实施和改进。
为什么我需要提供自定义实现?
的自定义实现swap
对于特定类型,当您的实现比标准版本更高效或更具体时,通常建议使用 。
一个典型的(C++11 之前的)示例是当您的类管理大量资源时,复制然后删除这些资源的成本会很高。相反,您的自定义实现可以简单地交换实现交换所需的句柄或指针。
随着std::move
和可移动类型(并实现了您的类型),大约 C++11 及更高版本,这里的许多原始基本原理开始消失;但尽管如此,如果自定义交换比标准交换更好,请实施它。
通用代码通常能够使用您的自定义swap
如果它使用ADL机制得当。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)