为什么/何时我们更喜欢using std::swap; swap(a, b);
而不是std::iter_swap(&a, &b)
?
答案 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
:
iter_swap
的重载,这比普通值交换更聪明(可能更合适 1 ) 。 swap
重载来有效地交换这两个元素。如果(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);
第一个涉及更少的打字,更重要的是。