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

Replace swap implementation for built-in types in C++

本文关键字:交换 实现 置类型 内置 替换      更新时间:2023-10-16

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

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

请就这种情况提供建议。

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

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

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

您可以尝试的是创建自己的类,使其仅包含一个char元素,然后在其中添加任何奇特的功能。这样,您将拥有自己的swap行为而不会破坏某人Elses代码。


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

#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


AD。编辑问题:

公平的洗牌算法相当简单:

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

但是,如果您修改swap以防止当两个参数都不是字母数字时(我认为这是您想更改交换的内容?),其余的排列将不公平。随着非alhanumenumeric字符数量的增加,给定字符的机会不会移动 - 增加。在最坏的情况下,想象一个只有两个字母数字字符的长字符串 - 交换它们的机会将接近0。

如果您只想在只能执行的非阿尔法字符上置于公平置换:

a)非常简单的方式 - 提取字母数字字符以分开数组,洗牌,然后将其放回。

简单,没有性能命中,但需要更多的内存。

b)如果非alphanumeric字符的数量相对较低,则可以重复骰子卷:

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

这种改组仍然是公平的,但是当您有很多非弱点字符时,会花很多时间。