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

发布于 2022-09-01 22:08:48 字数 520 浏览 14 评论 0

按照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源码可以交换整个数组。而且,我并没有传整个数组的长度进去。甚至类似的,多维数组也可以交换。
那么他实现的机理是什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜味拾荒者 2022-09-08 22:08:48

题主,下面是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;
白首有我共你 2022-09-08 22:08:48
int a[] = {1,2,3};
int b[] = {2,4,5,6};
std::swap(a, b);

你编译一下这个代码就明白了, 不明白再来上面问

叫思念不要吵 2022-09-08 22:08:48

你没理解c++引用这个概念。
引用和指针相似,但又不同。
解引用操作会得到原对象本身,而不像指针那样,只能得到指针指向的那一块内存中的内容
so,

swap ( T& a, T& b )

就相当于把整个数组传给函数了,这就是引用的优越之处,不然干嘛c++弄个引用的概念呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文