boost 库实用工具 swap

swap

boost::swap是对标准库提供的std::swap的增强和泛化,未交换两个变量的值提供便捷的方法。

1
#include <boost/swap.hpp>

原理

std::swap()的经典实现。

1
2
3
4
5
6
7
template<typename T>
void swap(T& a, T& b)
{
T tmp(a);
a = b;
b = tmp;
}

std::swap()要求交换的对象必须是可拷贝构造和可拷贝赋值的,提供的是最通用效率最低的方法,需要进行一次拷贝构造和两次赋值操作。

boost::swap的工作原理:

  • 直接利用函数重载,编写同名swap函数,调用类内部高效成员交换函数。
  • 使用ADL(参数依赖查找)查找模版特化的swap。

boost::swap()函数声明:

1
2
template <typename T1, typename T2>
void seap(T1 &left, T2 &right);

交换数组

boost::swap交换数组使用for循环,对数组中每个元素调用但个元素版的boost::swap完成整个数组内容的交换。要求交换的数组必须具有相同长度,否则无法编译通过。

特化std::swap

在std名字空间中添加自定义swap函数。

特殊ADL可找到的swap

boost::swap会通过ADL规则找到特化的交换函数。

使用建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class test
{
public:
void swap(test &l)
{
cout<<"test swap"<<endl;
}
};

void swap(test &r, test &l)
{
r.swap(l);
}

//swap
void TestSwap()
{
int x[10];
int y[10];
fill_n(x, 10, 5);
fill_n(y, 10, 10);
boost::swap(x, y);
for_each(x, x+10, print<int>);
for_each(y, y+10, print<int>);

int x2[20];
int y2[10];
fill_n(x2, 20, 5);
fill_n(y2, 10, 10);
//boost::swap(x2, y2); //编译报错

test a;
test b;
std::swap(a, b);
boost::swap(a, b); //会调用swap(test &, test &);

return ;
}