在C ++中替换内置类型的交换实现

时间:2012-11-06 05:41:05

标签: c++

我想更改std::swap类型char的行为。根据我所学到的,唯一的方法是为std::swap添加模板专业化,不是吗?

由于char是内置类型,因此我们没有机会使用ADL。

请就此类案件提出建议。

编辑:这是我需要解决的原始问题。随机随机播放一个字符串,但非字母字符应保持其位置不变。

我想要做的第一件事就是利用std::random_shuffle

1 个答案:

答案 0 :(得分:2)

第一:不要那样做。您可能会无意中破坏以前工作的代码的不同部分。

你可以尝试创建自己的类,让它只包含一个char元素,然后为你喜欢添加任何花哨的功能。通过这种方式,您可以拥有自己的swap行为,而不会破坏别人的代码。


但是,如果您仍想这样做,请尝试以下(运行)示例:

#include <algorithm>
#include <iostream>

namespace std {
template <>
void swap<char>(char& a, char& b) {
  std::cerr << "Swapped " << a << " with " << b << "\n";
  char t=a;
  a=b;
  b=t;
}
}

int main() {
  char arr[] = {'a', 'z', 'b', 'y'};
  std::reverse(arr, arr+4);
  return 0;
}

请注意,某些stl算法可能专门用于基本类型,而根本不使用std::swap


广告。编辑问题:

公平改组算法相当简单:

for (i = 0 .. n-2) {
  j = random (i .. n-1);  //and NOT random (0 .. n-1)
  swap(array[i], array[j]);
}

但是,如果你修改swap以防止任何一个参数不是字母数字时的操作(我认为你想要改变掉的是什么?),剩下的排列就不公平了。随着非字母数字字符数量的增加,给定角色不会移动的几率增加。在最坏的情况下,想象一个只有两个字母数字字符的长字符串 - 它们被交换的机会将接近0。

如果你想只对非字母字符进行公平排列,你可以这样做:

a)非常简单的方法 - 提取字母数字字符以分离数组,随机播放,然后将它们放回去。

简单,没有性能损失,但需要更多内存。

b)如果非字母数字字符的数量相对较少,您可以重复掷骰子:

for (i = 0 .. n-2) {
  if (!alphanumeric(array[i]) continue;
  do {
    j = random (i .. n-1);
  while (!alphanumeric(array[j]));
  swap(array[i], array[j]);
}

这种改组仍然是公平的,但是当你有很多非字母数字字符时会花费很多时间。