iter_swap有什么作用?

39

我只是想知道,为什么会有人写出这样的东西:

std::iter_swap(i, k);

改为这个?

std::swap(*i, *k);   // saved a few keystrokes!

然后我查看了iter_swap的实现,当然它只使用swap而不是std::swap,因为我们已经在namespace std中了。这就引出了下一个问题:

为什么会有人写出这样的代码:

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

而不是这个吗?

std::iter_swap(&a, &b);   // saved an entire line of code!

我有没有忽略掉任何重要的差异或问题?


1
保存代码可能是值得的(减少复杂性更容易理解)...但是节省行数的代码? 完全没有用,常常适得其反。 - Ben Voigt
3
不不不,你需要使用using std::iter_swap; iter_swap(i, k);,因为iter_swap可能已经被专门优化了。(开玩笑的,我想。) - Potatoswatter
4
你已经查看了 iter_swap 的一种实现方式,但为什么你认为它不能使用 std::swap 实现呢?请翻译。 - R. Martinho Fernandes
3
规定要正确使用ADL。(17.6.3.2) - Potatoswatter
哦,那就不要理我了。继续做你的事吧。 - R. Martinho Fernandes
1
类似的问题,更深入的答案:https://dev59.com/W2Yr5IYBdhLWcg3wAFrE - Potatoswatter
2个回答

41

来自 SGI 文档 (这里):

[1] 严格来说,iter_swap 是冗余的。它仅出于技术原因存在:在某些情况下,一些编译器难以执行所需的类型推导,以解释 swap(*a, *b)。


12
为了回答你的第二个问题,using + swap 允许编译器使用用户定义的交换函数,这可能比默认实现更有效(通过使用ADL)。显式地使用 std::swap 可以抑制 ADL 以及可能已经找到的任何自定义交换方法。
至于 iter_swap,它很可能是用在模板中,明确地表示意图,而不是一个可能暗示你期望指针的交换。

哦,我忽略了这个,因为我完全相信Fred知道ADL和std::swap惯用法 :) - sehe
我的第二个问题中没有std::swap的调用。我的意思是,std::iter_swap也会选择用户定义的交换,而无需编写using语句。对吗? - fredoverflow
1
@FredOverflow:但不包括用户定义的iter_swap ;) - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接