我想更改std::swap
类型char
的行为。根据我所学到的,唯一的方法是为std::swap
添加模板专业化,不是吗?
由于char
是内置类型,因此我们没有机会使用ADL。
请就此类案件提出建议。
编辑:这是我需要解决的原始问题。随机随机播放一个字符串,但非字母字符应保持其位置不变。
我想要做的第一件事就是利用std::random_shuffle
。
答案 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]);
}
这种改组仍然是公平的,但是当你有很多非字母数字字符时会花费很多时间。