开发者社区> 问答> 正文

STL中swap,实现交换两个数组的功能的原理是什么?

按照http://www.cplusplus.com/reference/algorithm/swap/中提到的,swap的原理应该是这样的:

template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}
比如

a[] = {1, 2, 3}; 
b[] = {4, 5, 6};
swap(a, b)
就可以将两个数组进行交换。
但是按照我传统对C语言的理解,我本身自己写的函数如

void func(int *a){
    //TODO
}
func(a);

传过去的是个数字首个内容的地址。如果交换指针的值的话,交换的也只是首个位置,无法更改后续位置。
而swap源码可以交换整个数组。而且,我并没有传整个数组的长度进去。甚至类似的,多维数组也可以交换。
那么他实现的机理是什么呢?

展开
收起
a123456678 2016-06-08 21:58:47 2590 0
1 条回答
写回答
取消 提交回答
  • 题主,下面是swap的实现,它使用的是模板实现,当我传递数组给它的时候,它能推导出数组大小是多少,比如int a[] ={1,2,3,4},当给把a传递给这个函数的时候,其中_Size就推导出来是4.

    template<class _Ty,size_t _Size> 
    inlinevoid swap(_Ty (&_Left)[_Size], _Ty (&_Right)[_Size])
        {    
        if (&_Left != &_Right)
            {    
            _Ty *_First1 = _Left;
            _Ty *_Last1 = _First1 + _Size;
            _Ty *_First2 = _Right;
            for (; _First1 != _Last1; ++_First1, ++_First2)
                _STD iter_swap(_First1, _First2);
            }
        }
    iter_swap的功能是交换两个迭代器指向的值,
    
    template<class _FwdIt1,
        class _FwdIt2> inline
        void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
        {    // swap *_Left and *_Right
        swap(*_Left, *_Right);
        }
    上面swap里的内容是下面这样的:
    
            tmp = *_Right;
            *_Right = *_Left;
            *_Left = tmp;

    题主,下面是swap的实现,它使用的是模板实现,当我传递数组给它的时候,它能推导出数组大小是多少,比如int a[] ={1,2,3,4},当给把a传递给这个函数的时候,其中_Size就推导出来是4.

    template<class _Ty,size_t _Size> 
    inlinevoid swap(_Ty (&_Left)[_Size], _Ty (&_Right)[_Size])
        {    
        if (&_Left != &_Right)
            {    
            _Ty *_First1 = _Left;
            _Ty *_Last1 = _First1 + _Size;
            _Ty *_First2 = _Right;
            for (; _First1 != _Last1; ++_First1, ++_First2)
                _STD iter_swap(_First1, _First2);
            }
        }
    iter_swap的功能是交换两个迭代器指向的值,
    
    template<class _FwdIt1,
        class _FwdIt2> inline
        void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
        {    // swap *_Left and *_Right
        swap(*_Left, *_Right);
        }
    上面swap里的内容是下面这样的:
    
            tmp = *_Right;
            *_Right = *_Left;
            *_Left = tmp;
    2019-07-17 19:32:49
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载