gpt4 book ai didi

c++ - 来自 C++ 编程语言的排序示例

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:58 27 4
gpt4 key购买 nike

我正在“C++ 编程语言”中查看以下示例代码:

typedef int (*CFT) (const void*, const void*);

void ssort(void* base, size_t n, size_t sz, CFT cmp) {
for (int gap = n / 2; 0 < gap; gap /= 2) {
for (int i = gap; i < n; i++) {
for (int j = i - gap; 0 <= j; j -= gap) {
char* b = static_cast<char*>(base);
char* pj = b + j * sz;
char* pig = b + (j + gap) * sz;

if (cmp(pig, pj) < 0) {
for (int k = 0; k < sz; k++) {
std::swap(pj[k], pig[k]);
}
} else {
break;
}
}
}
}
}

int cmp(const void* a, const void* b) {
return *(static_cast<const int*>(a)) - *(static_cast<const int*>(b));

}

谁能解释一下这些转换为 char* 的内容是什么?我们如何使用 char* 指向任何类型的值?

最佳答案

请记住,这是一个示例,通过说明 C 编程在处理 泛型

引用: C++ 编程语言(第 4 版第 334 页)

This style of code is common in C, but it is not the most elegant way of expressing this algorithm in C++

但是:

char* b = static_cast<char*>(base);
char* pj = b + j * sz;
char* pig = b + (j + gap) * sz;

原因 void 指针被强制转换为 char 指针是因为您不能对 void*< 进行指针运算.

指针运算以指针指向的对象的大小单位。因此,要进行指针运算,编译器需要知道指针的类型,这样它才能知道如何对其值进行加减。

这对于 void* 是不可能的,因为 void 没有大小。通过接受 void* 参数,原来的 type 已经丢失。

为了解决这个问题,算法将 void* 转换为 char*字符*one 为单位工作。然后该函数期望用户将每个元素的实际大小作为另一个参数传递。

编译器可以毫不费力地对生成的 char* 进行算术运算。

因为 ssort() 函数不知道它正在排序的元素的类型,调用者还需要传入它们自己的元素函数进行元素之间的比较。请注意,传入 函数会将 void* 参数转换为正确的类型。

这是有效的,因为调用 ssort() 函数的人知道要排序的 typessort() 函数不知道需要。

这给函数调用者带来了很大的负担,并且有很大的错误空间很多会导致细微或不那么细微的错误。

C++ 中,应该像避免瘟疫一样避免这种类型的编程。

总结:

ssort() 函数将 void* 转换为 char* 以便它可以进行指针运算来定位需要比较的元素。

调用者 传入他们自己的函数 (cmp),该函数将 void* 转换为正确的类型,以便进行比较。

关于c++ - 来自 C++ 编程语言的排序示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427620/

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