按照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源码可以交换整个数组。而且,我并没有传整个数组的长度进去。甚至类似的,多维数组也可以交换。
那么他实现的机理是什么呢?
天蓬老师2017-04-17 13:10:04
題主,下面是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;
PHP中文网2017-04-17 13:10:04
int a[] = {1,2,3};
int b[] = {2,4,5,6};
std::swap(a, b);
你編譯一下這個程式碼就明白了, 不明白再來上面問
伊谢尔伦2017-04-17 13:10:04
你沒理解c++引用這個概念。
引用和指標相似,但又不同。
解引用操作會得到原始物件本身,而不像指標那樣,只能得到指標指向的那一塊記憶體中的內容
so,
swap ( T& a, T& b )
就等於把整個陣列傳給函數了,這就是引用的優越之處,不然幹嘛c++弄個引用的概念呢?