我尝试使用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);
}
我的代码出了什么问题?
答案 0 :(得分:1)
std::sort:如果第一个参数小于(即在之前排序)第二个参数,则它所期望的比较对象必须返回true。
strcmp,您提供的函数有另一个返回约定:
(这里lhs和rhs向左手操作员和右手操作员提供)
所以你必须围绕strcmp创建自己的包装函数。
如果您可以使用c ++ 11,并且如果您可以使用c ++实现(即std::string
和std::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
函数,它返回true
或false
,而不是-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);
感谢您的帮助。