Why/when 我们应该更喜欢使用 std::swap;将 (a, b) 换成 std::iter_swap(&a, &b)?

Why/when should we prefer using std::swap; swap(a, b) over std::iter_swap(&a, &b)?

Why/when 我们应该更喜欢 using std::swap; swap(a, b); 而不是 std::iter_swap(&a, &b)

来自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);

第一个涉及更少的打字和更多的重点。

因为它们完全不同,所以你的问题是错误的二分法。

他们做不同的事情!

  • 一个交换值。
  • 另一个交换迭代器目标的内容。

但是如果你有迭代器。使用 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.

一般来说,标准要求

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. 迭代器引用的 class 的实现者可能提供了 swap 重载以有效地交换两个元素。

如果 (1) 不是这种情况,我可能会得到 (2),并且只有当两个选项都不适用时才使用 std::swap 并移动(或者在不可移动类型的情况下复制)对象交换它们。

请注意,使用 iter_swap 的标准算法不会启用调用。

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

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