iter_swap有什么意义?

fre*_*low 34 c++ templates swap namespaces argument-dependent-lookup

我只是想知道,为什么有人写这个:

std::iter_swap(i, k);
Run Code Online (Sandbox Code Playgroud)

而不是这个?

std::swap(*i, *k);   // saved a few keystrokes!
Run Code Online (Sandbox Code Playgroud)

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

为什么有人写这个:

using std::swap;
swap(a, b);
Run Code Online (Sandbox Code Playgroud)

而不是这个?

std::iter_swap(&a, &b);   // saved an entire line of code!
Run Code Online (Sandbox Code Playgroud)

我在这里忽略了重要的差异/问题吗?

seh*_*ehe 35

来自SGI文档(这里):

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


Mar*_*k B 11

为了回答第二个问题,using+ swap允许编译器使用用户定义的交换函数,这些函数可能比默认实现更有效(通过使用ADL).明确地说std::swap禁止ADL和它可能已经找到的任何自定义交换方法.

至于iter_swap它可能在模板中使用并清楚地表明意图而不是交换,这可能表明你期望指针.