是否可以使用交换功能来交换元素?

问题描述 投票:0回答:2

我知道这听起来很傻但我对此并不十分肯定,因为我们的老师告诉我们应该交换这样的元素

int a=3, b=1, tmp;  
tmp=a;  
a=b;  
b=tmp

而不是那样的

int a=3, b=1;  
swap(a,b);  

你能告诉我使用swap函数交换变量有什么不好吗?

c++ swap
2个回答
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
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.