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
:
- 迭代器来自的容器的实现者可能为这些迭代器提供了
iter_swap
的重载,这更智能(甚至可能更合适1)而不是普通的价值互换。
- 迭代器引用的 class 的实现者可能提供了
swap
重载以有效地交换两个元素。
如果 (1) 不是这种情况,我可能会得到 (2),并且只有当两个选项都不适用时才使用 std::swap
并移动(或者在不可移动类型的情况下复制)对象交换它们。
请注意,使用 iter_swap
的标准算法不会启用调用。
1 可能适用于不直接表示对象(即 zip-ranges)的特殊迭代器(范围)。
3 年后,但我认为唯一的技术问题是 operator &()
是否过载。
如果没有,我看到的唯一其他原因就是可读性。
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
:
- 迭代器来自的容器的实现者可能为这些迭代器提供了
iter_swap
的重载,这更智能(甚至可能更合适1)而不是普通的价值互换。 - 迭代器引用的 class 的实现者可能提供了
swap
重载以有效地交换两个元素。
如果 (1) 不是这种情况,我可能会得到 (2),并且只有当两个选项都不适用时才使用 std::swap
并移动(或者在不可移动类型的情况下复制)对象交换它们。
请注意,使用 iter_swap
的标准算法不会启用调用。
1 可能适用于不直接表示对象(即 zip-ranges)的特殊迭代器(范围)。
3 年后,但我认为唯一的技术问题是 operator &()
是否过载。
如果没有,我看到的唯一其他原因就是可读性。