C++ 为什么/何时我们更喜欢使用std::swap;交换(a,b)超过标准::国际热核聚变实验堆交换(a,b)?
为什么/什么时候我们更喜欢使用std::swap;掉期(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::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
重载来有效地交换这两个元素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);