使用 std::sort 对 C 字符串数组进行排序
Using std::sort to sort an array of C strings
我正在尝试使用 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);
}
我的代码有什么问题?
我已经开始工作了。就像@bolov 和@Svalorzen 说的,我不得不写一个 bool
函数 returns 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);
感谢您的帮助。
std::sort:如果第一个参数小于(即先于)第二个参数,则它期望的比较对象必须 return 为真。
strcmp,你提供的函数还有一个return约定:
- 如果 lhs 小于 rhs,则为负值。
- 0 如果 lhs 等于 rhs。
- 如果 lhs 大于 rhs,则为正值。
(这里lhs和rhs指的是左手运算符和右手运算符)
因此您必须围绕 strcmp 创建自己的包装函数。
如果你可以使用 c++11 并且如果你可以真正使用 c++(即 std::string
和 std::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));
我正在尝试使用 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);
}
我的代码有什么问题?
我已经开始工作了。就像@bolov 和@Svalorzen 说的,我不得不写一个 bool
函数 returns 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);
感谢您的帮助。
std::sort:如果第一个参数小于(即先于)第二个参数,则它期望的比较对象必须 return 为真。
strcmp,你提供的函数还有一个return约定:
- 如果 lhs 小于 rhs,则为负值。
- 0 如果 lhs 等于 rhs。
- 如果 lhs 大于 rhs,则为正值。
(这里lhs和rhs指的是左手运算符和右手运算符)
因此您必须围绕 strcmp 创建自己的包装函数。
如果你可以使用 c++11 并且如果你可以真正使用 c++(即 std::string
和 std::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));