使用 std::sort 对 C 字符串数组进行排序

Using std::sort to sort an array of C strings

本文关键字:数组 字符串 排序 std sort 使用      更新时间:2023-10-16

>我正在尝试使用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);
}

我的代码有什么问题?

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

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

  • 如果 lhs 小于 rhs,则为负值。
  • 如果 LHS 等于 RHS,则为 0。
  • 如果 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);

λ解决方案:

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));

我已经让它工作了。就像@bolov和@Svalorzen所说,我必须编写一个返回truefalsebool函数,而不是像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);

感谢您的帮助。