【问题标题】:Using std::sort to sort an array of C strings使用 std::sort 对 C 字符串数组进行排序
【发布时间】:2015-01-29 11:04:55
【问题描述】:

我正在尝试使用 std::sort 对 C 字符串数组进行排序。这是我所做的:

const char *tab[5];
//then fill up the tab
sort(tab, tab+5);

这似乎不起作用。我也尝试过使用sort(tab, tab+5, strcmp),它有效,但是当我将它放入函数时,数组保持不变。排序功能:

void sortfunc (const char *tab[], int n){
    filltab(tab, n); //n is the ammount of strings
    sort(tab, tab+n, strcmp);
}

我的代码有什么问题?

【问题讨论】:

    标签: c++ arrays sorting


    【解决方案1】:

    std::sort:如果第一个参数小于(即排在前面)第二个参数,则它所期望的比较对象必须返回真。

    strcmp,你提供的函数有另一个返回约定:

    • 如果 lhs 小于 rhs,则为负值。
    • ​0​如果 lhs 等于 rhs。
    • 如果 lhs 大于 rhs,则为正值。

    (这里lhs和rhs指的是左手算子和右手算子)

    所以你必须围绕 strcmp 创建自己的包装函数。

    如果您可以使用 c++11 并且可以真正使用 c++(即 std::stringstd::vector),您可以使用其他很酷的技巧,例如 lambdas。


    经典解决方案:

    bool cmp(char const *lhs, char const *rhs) {
      return strcmp(lhs, rhs) < 0;
    }
    
    std::sort(tab, tab + n, cmp);
    

    lambda 解决方案:

    std::sort(tab, tab + n, [](char const *lhs,
                               char const *rhs) { return strcmp(lhs, rhs) < 0; });
    

    真正的 C++ 解决方案

    std::vector<std::string> v = ...;
    
    std::sort(std::begin(v), std::end(b));
    

    【讨论】:

      【解决方案2】:

      我已经开始工作了。就像@bolov 和@Svalorzen 所说,我必须编写一个bool 函数来返回truefalse,而不是像strcmp() 那样返回-1、0、1。在这里,如果将来有人需要它:

      bool cmp(const char *str1, const char *str2){
          if(strcmp(str1, str2)<0) return true;
          else return false;
      }
      sort(tab, tab+5, cmp);
      

      感谢您的帮助。

      【讨论】:

      • 每当您看到自己在做if (condition) return true; else return false; 时,您就可以返回条件本身。所以,return condition;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多