我知道这听起来很傻但我对此并不十分肯定,因为我们的老师告诉我们,我们应该像这样交换元素
int a=3, b=1, tmp;
tmp=a;
a=b;
b=tmp
而不是那样
int a=3, b=1;
swap(a,b);
你能告诉我使用函数swap
来交换变量
答案 0 :(得分:4)
三种情况中的一种是真的。
std::swap
与您教师提供的示例代码完全相同,因为std::swap
的规范实施只是A temp = std::move(a); a = std::move(b); b = std::move(temp);
std::swap
是更好的代码,而不是您老师提供的示例代码,因为有些对象可以优化掉头而无需将整个对象移动3次。std::swap
更糟糕的是,因为未指定std::
前缀,所以swap
的调用可能会获取某个函数的ADL版本可怕的代码实际上没有做它声称做的事情。 (例如:void swap(A & a, A & b) {a.val += 15;}
)情景3在理论上是可行的,但极不可能。如果您的老师没有明确表示这就是正在发生的事情,那么这可能不是值得考虑的情景。因此,我们只能根据前两种情况推断教师的意图。
在这些情况下,由于std::swap
基本上总是会更好或完全一样好,我唯一的结论是你的老师要么预计会有std::swap
无法访问的情况,要不然只是试图明确教你如何自己实现swap
。
或者你的老师可能对自己的工作不好。但是,首先假设前面的解释。
答案 1 :(得分:1)
std::swap
没有什么不好,事实上,在某些情况下,第一种交换方法甚至可能错误。例如,std::unique_ptr
有一个已删除的复制构造函数,因此您无法将其复制到临时版本并返回。另一方面std::swap
函数运行正常。
#include <memory>
struct A {};
int main()
{
auto a = std::make_unique<A>();
auto b = std::make_unique<A>();
// Does not work!
// Copy constructor is deleted.
std::unique_ptr<A> tmp;
tmp = a;
a = b;
b = tmp;
// Works just fine.
std::swap(a,b);
}