我正在尝试对声明为string *names1 = new string[1];
的数组进行排序(数组的大小随着添加更多项而增长)。
我正在把它放在那里。排序前的数组中的项目是:
novot
svobodovaa
novakj6 3
vondraj1234
调用qsort(names1, size, sizeof (string), compare);
后,其中compare实现如此
int compare(const void * a, const void * b) {
return ( *(char*) a - *(char*) b);
}
我的数组中的项目以这种方式加扰
vondraj1234
novakj6
novot
svobodovaa
有谁知道,哪些错误不允许我按字母顺序对数组进行排序?
答案 0 :(得分:3)
您可以仅使用qsort
类型,可以使用memcpy
进行复制。 std::string
(以及具有非平凡赋值运算符的任何其他类型)不符合条件。相反,请使用std::sort
。它知道如何正确复制对象。
答案 1 :(得分: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
对象的第一个字节。这很可能不包含字符串的第一个字符,但是跳转表或机器代码。因此有点随机的结果......