iter_swap有什么意义?

时间:2012-12-21 14:26:44

标签: c++ templates namespaces swap argument-dependent-lookup

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

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!

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

2 个答案:

答案 0 :(得分:35)

来自SGI文档(here):

  

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

答案 1 :(得分:10)

要回答第二个问题,using + swap允许编译器使用可能比默认实现(使用ADL)更高效的用户定义交换函数。明确地说std::swap禁止ADL以及它可能找到的任何自定义交换方法。

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