【问题标题】:What's the point of iter_swap?iter_swap 的意义何在?
【发布时间】:2012-12-09 03:19:04
【问题描述】:

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

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!

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

【问题讨论】:

  • 保存代码可能是值得的(降低复杂性更容易推理)...但是保存 代码?完全没用,往往适得其反。
  • 不不不,你需要做using std::iter_swap; iter_swap(i, k); 因为iter_swap 可能是专门的。 (开个玩笑。我想。)
  • 您已经研究了iter_swap一个 实现,但为什么您认为它不能用std::swap 实现?
  • @R.MartinhoFernandes 指定正确使用 ADL。 (17.6.3.2)
  • 类似Q,更深入的回答:stackoverflow.com/q/14024228/153285

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


【解决方案1】:

来自 SGI 文档 (here):

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 哦,我忽略了这一点,因为我绝对相信 Fred 知道 ADL 和 std::swap 成语:)
    • 我的第二个问题中没有 std::swap 调用。我的观点是std::iter_swap 也将获得用户定义的交换,而无需编写using 语句。对吗?
    • @FredOverflow:但不是用户定义的iter_swaps ;)
    猜你喜欢
    • 2019-01-31
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2023-03-29
    • 2016-04-14
    • 2010-10-27
    • 2023-03-04
    相关资源
    最近更新 更多