用swap函数交换元素可以吗?
Is it alright to use swap function to swap elements?
我知道这听起来很傻,但我不太确定,因为我们的老师告诉我们应该像那样交换元素
int a=3, b=1, tmp;
tmp=a;
a=b;
b=tmp
不是那样的
int a=3, b=1;
swap(a,b);
你能告诉我使用函数 swap
交换变量有什么不好吗
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);
}
三种情况之一为真。
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
。
或者您的老师可能不擅长他们的工作。不过,首先假设前面的解释。
我知道这听起来很傻,但我不太确定,因为我们的老师告诉我们应该像那样交换元素
int a=3, b=1, tmp;
tmp=a;
a=b;
b=tmp
不是那样的
int a=3, b=1;
swap(a,b);
你能告诉我使用函数 swap
交换变量有什么不好吗
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);
}
三种情况之一为真。
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
。
或者您的老师可能不擅长他们的工作。不过,首先假设前面的解释。