0

我正在尝试对声明为的数组进行排序string *names1 = new string[1];(数组的大小随着添加更多项目而增长)。

我在那里放字符串。排序前数组中的项目是: novot svobodovaa novakj6 3 vondraj1234

调用后qsort(names1, size, sizeof (string), compare);,比较是这样实现的

int compare(const void * a, const void * b) {
return ( *(char*) a - *(char*) b);
}

我的数组中的项目是这样打乱的 vondraj1234 novakj6 novot svobodovaa

有谁知道,不允许我按字母顺序对数组进行排序的错误在哪里?

4

2 回答 2

3

只能使用qsort可复制的类型memcpystd::string(以及具有非平凡赋值运算符的任何其他类型)不符合条件。相反,使用std::sort. 它知道如何正确复制对象。

于 2013-03-18T14:16:37.480 回答
0

我将首先挑剔你问题的质量较差,请耐心等待。

string *names1 = new string[1];

这为您提供了一个包含一 (1) 个字符串对象的数组。

(数组的大小随着添加更多项目而增长)

错误的。您的数组的大小可能会这样做,因为您希望为此特定目的编写代码。数组的大小不会自动调整。(这就是vector目的。)

我在那里放字符串。排序前数组中的项目是:novot svobodovaa novakj6 3 vondraj1234

在一个字符串中?还是作为字符串数组?在后一种情况下,我希望看到一些证据,例如:

for ( size_t i = 0; i < size; ++i )
{
    std::cout << i << ": " << names1[i] << "\n";
}

理想情况下,就在您的行之前:

qsort(names1, size, sizeof (string), compare);

(我只是希望并假设它size实际上正确的大小names1,这是我上面的小循环将证明的另一件事。)


但是,您遇到麻烦的真正原因是这一行:

return ( *(char*) a - *(char*) b);

您将string *(指向对象的指针)转换为char *(指向普通旧数据的指针),并且您正在执行 C 风格(char*)而不是 C++ 风格(static_cast< char * >()),因此您的编译器甚至无法正确抱怨。

当您取消引用这两个指针时,您将string分别获得两个对象的第一个字节。这很可能不是包含字符串的第一个字符,而是跳转表或机器代码。因此有点随机的结果......

于 2013-03-18T14:08:10.023 回答