为什么/何时我们应该更喜欢使用std :: swap;交换(a,b)over std :: iter_swap(& a,& b)?

时间:2015-05-18 00:08:31

标签: c++ algorithm swap argument-dependent-lookup

为什么/何时我们更喜欢using std::swap; swap(a, b);而不是std::iter_swap(&a, &b)

4 个答案:

答案 0 :(得分:0)

由于它们完全不同,你的问题是错误的二分法。

他们做不同的事情!

  • 一次交换价值。
  • 另一个交换迭代器目的地的内容。

但是如果你有迭代器。使用std::iter_swap可能更好。否则你可以使用swap(只要你在本地完成using std::swap;调用swap(否则,正确交换的类型相关锁定可能会失败)。

std::iter_swap(i1, i2);

// Is equivelent to writing.
using std::swap;  // Notice this. 
swap(*i1 ,*i2);   // Notice the * in front of the iterator.

答案 1 :(得分:0)

通常,标准要求

std::iter_swap(&a, &b);

具有相当于

的效果
using std::swap;
swap(*(&a), *(&b));

虽然它可能以不同的方式实施。 (至少g ++和msvc只是交换...)

知道了,我会考虑

using std::swap;
swap(a, b);

更具体,直接和可读,因为它直接表达了所需的,支持adl的行为。

如果您首先拥有迭代器,那么我将坚持启用ADL iter_swap

using std::iter_swap;
iter_swap(it_a, it_b);

这里的原因是我有两次机会超越(或超越)默认std::swap

  1. 迭代器来自的容器的实现者可能为那些迭代器提供了iter_swap的重载,这比普通值交换更聪明(可能更合适 1 ) 。
  2. 迭代器引用的类的实现者可能提供了swap重载来有效地交换这两个元素。
  3. 如果(1)不是这种情况我可能会得到(2)并且只有当两个选项都不适用时才使用std::swap并且移动(或者在不可移动类型的情况下复制)对象周围的交换它们。

    请注意,使用iter_swap的std算法不会启用此调用。

    1 可能适用于不直接表示对象(即zip范围)的特殊迭代器(范围)。

答案 2 :(得分:0)

3年后,但我认为唯一的技术问题是operator &()是否过载 如果没有,我看到的唯一其他原因是可读性。

答案 3 :(得分:-1)

来自http://en.cppreference.com/w/cpp/algorithm/iter_swap

可能的实施

template<class ForwardIt1, class ForwardIt2>
void iter_swap(ForwardIt1 a, ForwardIt2 b)
{
   using std::swap;
   swap(*a, *b);
}

鉴于此,我认为

using std::swap;
swap(a,b);

优于

using std::iter_swap;
iter_swap(&a, &b);

第一个涉及更少的打字,更重要的是。