使用std :: sort来排序C字符串数组

时间:2015-01-29 11:04:56

标签: c++ arrays sorting

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

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

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

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

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

(这里lhs和rhs向左手操作员和右手操作员提供)

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

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


经典解决方案:

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

答案 1 :(得分:0)

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

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

感谢您的帮助。