跳转至

交换swap

交换是算法的基础,把交换做成通用的函数。

按值传递,把a和b各自拷贝一个传进去,只是把拷贝的数交换了,原来的a和b不会发生交换

void swap(int x, int y)
{
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
}

C语言需要传指针

C++可以传指针也可以传引用

宏定义函数

#define swap(x,y,t) ((t) = (x),(x) = (y),(y) = (t))

void test()
{
    int a,b,temp;
    a = 1;
    b = 10;
    std::cout << "a = " << a << ", b = " << b << std::endl;

    SWAP(a,b,temp);

    std::cout << "a = " << a << ", b = " << b << std::endl;
}

传指针

使用指针进行交换

void swap(int *px, int *py)
{
    int tmp;
    tmp = *px;
    *px = *py;
    *py = tmp;
}
void test()
{
    int a,b;
    a = 1;
    b = 10;
    std::cout << "a = " << a << ", b = " << b << std::endl;
    // 拷贝的是指针(地址) 拿到的是地址,操作的就是原来的数据
    swap(&a, &b);

    std::cout << "a = " << a << ", b = " << b << std::endl;
}

传引用

C语言大量使用指针比较复杂,容易出错,所以C++使用引用。

引用就是别名,这种最简单。

void swap(int &rx, int &ry)
{
    int tmp;
    tmp = rx;
    rx = ry;
    ry = tmp;
}
void test()
{
    int a,b;
    a = 1;
    b = 10;
    std::cout << "a = " << a << ", b = " << b << std::endl;
    // 引用就是别名,传的时候直接用就行了
    swap(a, b);

    std::cout << "a = " << a << ", b = " << b << std::endl;
}

C++做好的函数

并且还是模版函数,各种类型都可以使用。

template<class T> void swap(T& x, T& b);
void test()
{
    int a,b;
    a = 1;
    b = 10;
    std::cout << "a = " << a << ", b = " << b << std::endl;

    std::swap(a, b);

    std::cout << "a = " << a << ", b = " << b << std::endl;
}

总结

宏定义和C++做好的模版函数可以使用任何类型,传指针和传引用的只能是一种类型。