替换C 中内置类型的交换实现
Replace swap implementation for built-in types in C++
我想更改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]);
}
这种改组仍然是公平的,但是当您有很多非弱点字符时,会花很多时间。
相关文章:
- 对象内部有大量数据容器,实现更高效的对象交换
- 实现交换/复制功能:有没有更好的方法
- 实现了用于滤波器设计的remez交换算法
- 交换对象不实现移动语义时的交换函数
- 在 C++11 中实现复制和交换习语的更好方法
- 替换C 中内置类型的交换实现
- 在低级别实现交换复制位时可能会出现什么问题
- 交换实现:效率和适用范围?
- 在复制和交换习惯用法中实现交换
- 交换接口的实现
- 字节交换方面的一般交换实现
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 根据getcontext和setcontext实现交换上下文
- 如何在对象类型未知时实现交换函数
- std::sort 如何仅使用迭代器实现交换操作
- 使用 std::mutex 实现类交换
- 这是交换(多线程)的异常安全实现吗
- 用用户实现的交换来交换std::函数
- 原子比较和交换实现
- GCC 列表节点交换实现过于复杂