【问题标题】:qsort in C++ for string arrays?C ++中的qsort用于字符串数组?
【发布时间】:2013-04-19 17:42:34
【问题描述】:

我正在开发一个程序,它获取用户输入的单词列表,忽略大小写(大写和小写),然后使用函数 qsort 对它们进行排序。我在使用 qsort 时遇到问题,因为我不知道将什么作为第三项 qsort(array, sizeOfArray, ??, funcCompare) 传递。有人能指出我正确的方向吗?

using namespace std;

int compare(const void* , const void*);

const int SIZE = 100;
void main()
{

int i = 0;
int s = 0;
size_t size = 0;
string words;
string list[SIZE];
for (i = 0; i < SIZE; i++)
{
    cout << "Please enter a word. Press ^Z to quit: " << endl;
    cin >> words;
    transform(words.begin(), words.end(), words.begin(), ::tolower);
    if (words.length() > size)
    {
        size = words.length();
    }
    list[i] = words;
    if (cin.eof())
    {
        s = i;
        break;
    }
}
qsort(list, s, ?? , compare);
for (int j = 0; j < i; j++)
    {
        cout << list[j] << endl;
    }   
}

int compare(const void* p1, const void *p2)
{
char char1, char2;

 char1 = *(char *)p1;  // cast from pointer to void
 char2 = *(char *)p2;  // to pointer to int

 if(char1 < char2)
     return -1;
 else
 if (char1 == char2)
    return 0;
 else
    return 1;
 }

qsort 中有问题的位置有 '??'感谢您提供任何帮助!

这是一个作业

【问题讨论】:

  • 这是一项作业,还是您正在为一般问题寻找一个好的 C++ 解决方案?
  • 显然使用std::sortstd::vector&lt;std::string&gt;
  • 如果必须使用qsort,请不要使用std::string。如果你真的需要,在你的数组中使用 pointers 指向std::string

标签: c++ sorting qsort


【解决方案1】:

您需要传递数组中每个元素的大小,以字节为单位。

这是通过:sizeof(string)

qsort(list, s, sizeof(string), compare);

编辑:查看 alexrider 的帖子了解更多信息


我为BRL-CAD写了一个qsort字符串比较函数,这里是使用的比较函数(记住用C写的,可以优化)。

 * Sort function called by quick sort to sort data according
 * to its second field in the string
 */
int
sort(const void* a, const void* b)
{
    char *ia = *(char**)a;
    char *ib = *(char**)b;

    char Str[MAX_RESULT_LEN];
    char Str2[MAX_RESULT_LEN];

    //get string into array
    GetStr(ia, Str);
    GetStr(ib, Str2);

    int n1 = atoi(Str);
    int n2 = atoi(Str2);
    return (n2 - n1);
}

【讨论】:

  • 我试过sizeof(string),但它什么也没做。它所做的只是按照我输入的顺序显示单词。
  • 看一下我与 qsort() 结合使用的字符串排序函数的示例
【解决方案2】:

技术上你需要通过sizeof(string)
但是 std::string 不是普通类型,因此您不能使用qsort 对字符串数组进行排序。

25.5 C 库算法

4 函数签名:
qsort(void *, size_t, size_t, int (*)(const void *, const void ));
替换为两个声明:
extern "C" void qsort(void
base, size_t nmemb, size_t size, int (compar)(const void, const void*));
extern "C++" void qsort(void* base, size_t nmemb, size_t size, int (compar)(const void, const void*));
两者都具有与原始声明相同的行为。该行为是未定义的,除非 base 指向的数组中的对象是普通类型

如果你使用 C++ 和 std::string,你也应该使用 std::vector 代替普通数组和 std::sort 代替 qsort。

【讨论】:

  • 我使用qsort是作业的要求,你不能在向量上使用qsort,或者我已经阅读了。
  • @Kyle 不幸的是,你也不能在字符串数组上使用 qsort,如果你真的绑定到 qsort,你可以将指针存储在数组中,并提供比较实际字符串的比较函数,但 qsort 本身会对指针进行排序。
  • @Kyle:当然你可以在向量上使用qsort,如果你真的想的话;向量中的对象存储在数组中。 (当然,您不会想要,因为std::sort 更安全,而且可能更快)。但正如答案所说,您不能使用它对std::string 的数组进行排序。如果你的任务要求你这样做,那就是在要求不可能的事情。
  • @Kyle:请您的导师参考第 877 页第 25.5 节,第 4 段,此文档:open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf -- 这是官方 C++ 标准的当前草案。参考自本站:isocpp.org——C++官方网站。对于不太正式的反驳,请参阅此处的“注释”部分:en.cppreference.com/w/cpp/algorithm/qsort
  • 如果大小是固定的,普通数组没有任何问题。只需使用sort(begin(plain_array),end(plain_array));
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2013-07-12
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多