c++ std::swap() 函数

c++ std::swap() 函数

最近刚开始学习c++容器,发现容器中提供的swap()函数并不是交换了两个容器的内容,而是交换了两个容器的地址。比如如下代码:

#include 
#include 
using namespace std;

template<class Os, class Co> Os& operator<<(Os& os, const Co& co) {
    os << "{";
    for (auto const& i : co) { os << ' ' << i; }
    return os << " } ";
}

int main()
{
    vector<int> a{1,2,3,4,5};
    vector<int> b{9,8,7};
    cout<<a<<endl;
    cout<<b<<endl;
    int &ref1 = a.front();
    int &ref2 = b.front();
    auto iter1 = ++a.begin();
    auto iter2 = ++b.begin();

    cout<<"ref1 = "<<ref1<<", "<<"ref2 = "<<ref2<<endl;
    cout<<"*iter1 = "<<*iter1<<", "<<"*iter2 = "<<*iter2<<endl;
    a.swap(b);
    cout<<a<<endl;
    cout<<b<<endl;
    cout<<"ref1 = "<<ref1<<", "<<"ref2 = "<<ref2<<endl;
    cout<<"*iter1 = "<<*iter1<<", "<<"*iter2 = "<<*iter2<<endl;
    return 0;
}

输出为:

{ 1 2 3 4 5 } 
{ 9 8 7 }
ref1 = 1, ref2 = 9
*iter1 = 2, *iter2 = 8
{ 9 8 7 }
{ 1 2 3 4 5 }
ref1 = 1, ref2 = 9
*iter1 = 2, *iter2 = 8

可见容器a、b只是交换了指向的地址。那c++提供的std::swap()是否也是只交换地址呢,这里我们来实验一下。

#include 

int main(){
    int a=4;
    int b=6;
    int *pa=&a;
    int *pb=&b;

    std::swap(a,b);
    std::cout<<a<<'\t'<<b<<std::endl;
    std::cout<<*pa<<'\t'<<*pb<<std::endl;

    std::swap(pa,pb);
    std::cout<<a<<'\t'<<b<<std::endl;
    std::cout<<*pa<<'\t'<<*pb<<std::endl;

    std::swap(*pa,*pb);
    std::cout<<a<<'\t'<<b<<std::endl;
    std::cout<<*pa<<'\t'<<*pb<<std::endl;

}

输出的结果为:

6       4
6       4
6       4
4       6
4       6
6       4

可见,交换 a、b的同时,指针指向的内存内容同时也改变了,说明此时交换的是 a、b变量中的内容,而不是改了a、b的地址。如果a、b是两个数组,swap(a,b) 就等同于代码中的swap(pa,pb)。交换的也是a、b的内容(此时a、b内存的是数组首变量地址),在效果上类似于a、b数组交换了。

一点愚见,欢迎指正。

你可能感兴趣的:(swap,c++,c++)