Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么/何时我们更喜欢使用std::swap;交换(a,b)超过标准::国际热核聚变实验堆交换(a,b)?_C++_Algorithm_Swap_Argument Dependent Lookup - Fatal编程技术网

C++ 为什么/何时我们更喜欢使用std::swap;交换(a,b)超过标准::国际热核聚变实验堆交换(a,b)?

C++ 为什么/何时我们更喜欢使用std::swap;交换(a,b)超过标准::国际热核聚变实验堆交换(a,b)?,c++,algorithm,swap,argument-dependent-lookup,C++,Algorithm,Swap,Argument Dependent Lookup,为什么/什么时候我们更喜欢使用std::swap;掉期(a、b)通过std::iter\u交换(&a和&b)?从 可能的实施 template<class ForwardIt1, class ForwardIt2> void iter_swap(ForwardIt1 a, ForwardIt2 b) { using std::swap; swap(*a, *b); } 比 using std::iter_swap; iter_swap(&a, &b);

为什么/什么时候我们更喜欢使用std::swap;掉期(a、b)通过
std::iter\u交换(&a和&b)

可能的实施

template<class ForwardIt1, class ForwardIt2>
void iter_swap(ForwardIt1 a, ForwardIt2 b)
{
   using std::swap;
   swap(*a, *b);
}

using std::iter_swap;
iter_swap(&a, &b);

第一个问题涉及更少的打字,更切题。

因为它们完全不同,你的问题是错误的二分法

他们做不同的事情

  • 一个人交换价值
  • 另一个交换迭代器目标的内容
但是如果你有迭代器。使用
std::iter\u交换可能更好。否则,您可以使用swap(只要您对swap调用在本地使用std::swap;
完成了
)(否则,正确swap的依赖类型锁定可能会失败)


一般来说,标准要求

std::iter_swap(&a, &b);
其效果相当于

using std::swap;
swap(*(&a), *(&b));
然而,它的实现方式可能不同(至少g++和msvc只是交换…)

知道这一点,我会考虑< /P>
using std::swap;
swap(a, b);
更具体、直接和可读,因为它直接表达了所需的、支持adl的行为

如果您首先有迭代器,那么我会坚持使用ADL启用的iter\U交换

using std::iter_swap;
iter_swap(it_a, it_b);
这里的原因是,我有两次机会超越(或超过)默认值
std::swap

using std::iter_swap;
iter_swap(it_a, it_b);
  • 迭代器来自的容器的实现者可能为这些迭代器提供了
    iter\u swap
    重载,这比普通值交换更聪明(可能更合适1)
  • 迭代器引用的类的实现者可能已经提供了
    swap
    重载来有效地交换这两个元素
  • 如果(1)不是这种情况,我可能会得到(2),并且只有当两个选项都不适用时,才使用
    std::swap
    ,并移动(或在不可移动类型的情况下复制)对象以交换它们

    请注意,使用iter\U交换的std算法不支持adl调用


    1可能适用于不直接表示对象(即zip范围)的特殊迭代器(范围)。

    3年后,但我认为唯一的技术问题是
    运算符(&()
    过载。

    如果不是,我看到的唯一其他原因是可读性。

    @T.C.:哈哈,很公平,但还有其他情况吗?(但请随意将其作为答案发布…)我认为,出于可读性的好处,你几乎应该总是“更喜欢”它。如果你真的把你的问题放在你的问题中,很难解析“使用”关键词是否在使用,而不是实际的单词?@Mehrdad。两年前你几乎没有问过这个问题吗?好吧,在我写了评论之后,我开始重新思考。额外的用法声明本身并不明显,因此我的评论可能只反映了我自己的经验偏见。对于任何特定的用例都是错误的?您需要使用依赖参数的查找,否则它将无法通过ADL查找任何用户定义的
    swap
    。@Mehrdad,我需要更深入地研究它。这对我来说并不明显。@Barry:
    std::swap(a,b);
    绝对不使用ADL。(你看的对吗?)@R Sahu:是的,这不是很明显,但是
    使用std::swap;swap(a,b);
    并不等同于
    std::swap(a,b);
    。不,据我所知,他们不能做不同的事情(除非超载
    &
    );标准要求后者必须具有与前者相同的效果。@Mehrdad:它们做的事情肯定完全不同。你能举个例子说明依赖类型的查找什么时候会失败吗?不,它们不能做不同的事情……你能举个例子说明它们做不同的事情吗?@Mehrdad:读我的答案。一个尊重迭代器另一个没有。你希望有多大的不同。你确定你仔细阅读了我的问题吗?你答案中的代码与我问的不一样。没有实际有用的方法来实现
    交换的效果,而不实际调用
    交换
    。这就是为什么它最终是多余和未使用的。@Mehrdad:实际上,我们也缺少了一些东西,比如
    iter\u move
    ,使
    iter\u swap
    成为一个非常有用的定制点,但它很可能会以这种方式使用。
    using std::iter_swap;
    iter_swap(it_a, it_b);