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>
中。