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

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

对于这种情况,请提供您的建议。

编辑:这是我需要解决的原始问题。除了非字母字符应保持其位置不变外,随机混洗字符串。

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

最佳答案

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

您可以尝试创建自己的类,使其仅包含一个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以防止当两个自变量中的任何一个都不为字母数字时操作(我想这就是您想要将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]);
}


这种混洗仍然很公平,但是当您有很多非字母数字字符时,将花费大量时间。

关于c++ - 替换C++中内置类型的交换实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13245067/

10-13 05:54