7

我有三个关于交换的问题,对你来说很可能是非常基本的。

(1) 对于两个相同类型的 STL 容器ab,以下两种操作都可以

swap(a,b);
a.swap(b);

我知道第二个是专门用于容器的(例如,只涉及一些迭代器交换),而第一个是一个全局算法,用于处理通用数据类型并执行内部复制构造。

我的问题是,如果我编写第一个,编译器是否会使用第二个,或者我是否必须小心检查是否存在适当的专业化?

(2) 会swap(a,b)产生与 相同的性能swap(b,a)吗?如果涉及复制构造并且对象的大小有很大不同,我怀疑这可能很重要?

(3) 在==存在重载运算符且速度较快的情况下,a == b在交换之前检查是有意义的,以避免不必要的操作。std::swap是先应用此检查,还是不管它是否执行操作?

谢谢你的时间!

4

1 回答 1

7
  1. 全局swap模板专门用于支持的每种标准库类型swap;专业化调用成员swap

  2. swap(a, b)和之间应该没有区别swap(b, a)。(我可以想象它很重要的反常类型,但这在实践中永远不会发生)。

  3. 不,std::swap 通常不检查是否相等。在许多情况下,这比仅仅进行交换要慢。

于 2012-09-06T14:51:16.883 回答