我有三个关于交换的问题,很可能对你很基本.
(1)至于两个同类型的STL容器a和b,下面这两个操作会工作
swap(a,b);
a.swap(b);
Run Code Online (Sandbox Code Playgroud)
我理解第二个是专门用于容器的(例如,只涉及许多迭代器交换),而第一个是一个全局算法,用于处理通用数据类型并执行内部复制构造.
我的问题是如果我写第一个,编译器是否会使用第二个,或者我是否必须小心检查是否存在适当的特化?
(2)会swap(a,b)导致相同的表现swap(b,a)吗?如果涉及复制构造并且对象的大小差异很大,我怀疑它可能很重要吗?
(3)在重载操作符==存在且相对较快的情况下,a == b在交换之前进行检查是有意义的,以避免不必要的操作.是std::swap先应用此检查,还是执行操作?
谢谢你的时间!
全局swap模板专用于支持的每种标准库类型swap; 专业化称呼成员swap.
swap(a, b)和之间应该没有区别swap(b, a).(我可以想象它有意义的反常类型,但在实践中永远不会发生).
不,std::swap 通常不检查是否相等.在许多情况下,这比仅仅进行交换要慢.