愚蠢的bug

今天写代码遇到了一个以前没有注意到的事情

class Solution {  // O(n^2), average O(n)
 public:
  
    ...
    ...

  static inline void swap(vector<int>& nums, int l, int r) {
    if (l == r) return ;
    // cout << "size " << nums.size() << " l " << l << " r " << r << endl;
    // cout << "before " << nums[l] << " " << nums[r] << endl;
    nums[l] ^= nums[r];
    nums[r] ^= nums[l];
    nums[l] ^= nums[r];
    // cout << "after " << nums[l] << " " << nums[r] << endl;
  }
};

写代码时,我经常用位操作代替常规操作,比如乘 2 除 2,判断奇偶,交换两个数等,因为位操作速度快一些,今天写一个交换函数时,没有注意到传入的两个下标可能存在相等情况,没有加入if (l == r) return ;这个判断条件,导致交换函数将传入的数变成 0 了。

附上C++11 <utility>头文件中swap()函数的可能实现。

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]);
}