zoukankan      html  css  js  c++  java
  • C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法

    这个问题屡次碰到解决之后再次遇到又忘记怎么弄了,这次打算彻底搞清楚。

    ·C

    首先对所谓字符数组的排序应该是对(char)*a[]数组而非(char)a[][]进行的排序,后者是无法直接调用qsort实现其排序的。

    cmp函数写法:

    1 int cmp(const void *a, const void *b){
    2     return strcmp(*((char**)a), *((char**)b));
    3 }

    很容易想象字符串在初始化时已经被分配了特定的存储空间,我们用其首地址标识该字符串。

    对于字符数组的排序实际上是对于变量类型:字符型指针(char*)的排序。

    排序的结果实际上是(字符)指针 数组元素位置的变化。

    因此cmp函数提供了const void型指针的接口,表示被排序的对象。

    我们要排序的是*a, *b(类型为void),由于我们要做的是对字符串(字符指针)排序。

    首先将其强制转化为指向字符指针的指针,这里相当于申请一个指向字符型的指针p,再让a指向p。

    那么有*a = p,这样就间接得到了指向对应字符串的char类型指针。

    也就可以同strcmp函数通过对原串的比较排序*a 与 *b。

     qsort函数的写法:

    1 qsort(a, n, sizeof(char*), cmp);

    ·C++

    c++的sort要简单些。

    sort函数写法:

    1 sort(a, a + n, cmp);

    cmp函数:

    1 bool cmp(char *a, char *b){
    2     return strcmp(a, b) < 0;
    3 }

    由于C++ sort 中cmp函数提供的接口是直接针对元素的排序,所以我们只需考虑对字符指针本身的比较就行了。

  • 相关阅读:
    第六章学习小结
    malloc iOS
    iOS事件传递机制
    对 runloop 的理解
    深恶痛绝重写setter和getter
    数据库常见问题总结
    iOS多应用自动打包
    一段文字中包含多种语言时行间距问题
    一个成熟应用的排版方案
    Flask纪要
  • 原文地址:https://www.cnblogs.com/astoninfer/p/4873034.html
Copyright © 2011-2022 走看看