gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:28:33 25 4
gpt4 key购买 nike

我想为 char 类型更改 std::swap 的行为。据我所知,唯一的方法是为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com