【问题标题】:generic swap function in c++ and arraysC++ 和数组中的通用交换函数
【发布时间】:2016-04-01 08:55:48
【问题描述】:
template <class T>
 void swap(T& a, T& b){
     T tmp = a; a = b; b = tmp;
}

我正在读一本书,它告诉我上面的代码将不适用于数组,除非我们重载了 '=' 运算符。我不明白为什么它不应该工作。我们不是在切换指向数组第一个索引的指针吗?

【问题讨论】:

    标签: c++ arrays parameter-passing swap


    【解决方案1】:

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

    那么您的误解是您可以只切换指针,这是无法做到的。 如果你有两个指针,交换它们可以正常工作,但你不能像那样切换数组。而且也不可能直接在调用中使用地址运算符来使用指向数组的指针,因为这将尝试将引用绑定到不可能的临时值。

    only 使用您的函数“交换数组”的解决方案类似于

    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
    

    【讨论】:

    • 另一种解决方案是交换数组的所有元素。有一个 overload of std::swap 可以做到这一点。
    【解决方案2】:

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

    没有这样的事情。听起来您对 C 样式数组的心智模型是指向某些元素的指针。然而这是错误的。其实C风格的数组只是元素,没有指针。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多