C++ swap 交换数组

1,228 阅读1分钟

C++ 交换数组

之前在使用 std::swap 交换数组,但是 C++ 的数组变量是不能被重新定义的,那么 std::swap 是如何交换这两个数组的呢?

在 CPlusPlus 网站上,std::swap 的声明如下:

// C++ 98 in <algorithm>
template <class T> void swap (T& a, T& b);
// C++ 11
template <class T> void swap (T& a, T& b) noexcept (is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value);

template <class T, size_t N> void swap(T (&a)[N], T (&b)[N]) noexcept (noexcept(swap(*a, *b)));

其效果大致如下:

// C++ 98
template <class T> void swap(T& a, T& b) {
  T c(a);
  a = b;
  b = c;
}
// C++ 11
template <class T> void swap(T& a, T& b) {
  T c(std::move(a));
  a = std::move(b);
  b = std::move(c);
}
template <class T, size_t N> void swap(T &a[N], T &b[N]) {
  for (size_t i = 0; i < N; ++i)
    swap(a[i], b[i]);
}

也就是说,C++ 11 后的 std::swap 交换数组实际上是在交换每一个元素,而不改变数组的指针。而且数组长度必须一致,这是符合 C++ 规范的,因为在运行状态下改变数组的指针将改变数组的属性,编译器无法确定数组的状态。

结论:最好不要对数组变量进行任何操作,复制和交换数组也是一个低效操作,也避免使用 std::swap 交换数组。

为了交换数组,可以使用两个指针保存数组的位置,然后直接使用指针来代表数组。

int a[100], b[100];

int main() {
    int* a1 = a;
    int* b1 = b;
    swap(a1, b1);
    // 下面直接使用 a1[i],b1[i]
}

在 C++ 98 std::swap 被定义在 <algorithm> 中,而 C++ 11 则定义在 <utility> 中。

参考

  1. cplusplus.com/reference/u…