c ++和数组中的通用交换函数

时间:2015-12-27 05:06:24

标签: c++ arrays parameter-passing swap

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

我正在读一本书,它告诉我上面的代码不适用于数组,除非我们重载&#39; =&#39;运营商。我不明白它为什么不应该工作。我们是不是将指针切换到数组的第一个索引?

2 个答案:

答案 0 :(得分:6)

首先,如果您将数组作为参数传递,则类型T将被推断为数组类型,这会导致问题,因为您无法分配数组,只能复制它们。

然后你误以为你可以只是切换指针,这是不可能完成的。 如果 你有两个指针,交换它们会很好但你不能像这样切换数组。并且在调用中直接使用address-of运算符也不可能使用指向数组的指针,因为它会尝试将引用绑定到不可能的临时值。

解决方案#34;交换数组&#34;使用你的功能就像是

char array1[...] = { ... };
char array2[...] = { ... };

char* pointer_to_array1 = array1;
char* pointer_to_array2 = array2;

swap(pointer_to_array1, pointer_to_array2);

// After call, pointer_to_array1 will point to the first element of array2
// and pointer_to_array2 will point to the first element of array1

答案 1 :(得分:2)

  

我们不是要切换指向数组第一个索引的指针吗?

没有这样的事情。听起来你的C风格数组的心智模型是一个指向某些元素的指针。但这是错误的。实际上C风格的数组只是元素,没有指针。

当我们需要时,我们可以形成一个指向第一个元素的临时指针,但是没有这样的指针与数组存储一起存储。

与任何其他对象一样,数组在其整个生命周期中都位于同一地址。交换两个数组只能通过交换每个元素的内容来完成。