我知道我不应该使用C风格的数组,但无论如何我都试图寻找一种方法。我正在尝试按字母顺序排列const char*
数组,但std::sort
没有做到正确。我做错了什么?
#include <iostream>
#include <algorithm>
int main() {
const char * str[5] = {"alpha", "gamma", "beta", "delta", "chi"};
int size = sizeof(str)/sizeof(*str);
std::sort(str, str + size);
for (int i = 0; i < size; i++) std::cout << str[i] << ", ";
}
它根本不会改变数组。我做得不对劲?
答案 0 :(得分:5)
默认的std::sort
比较函数只是将指针(内存地址)与<
运算符进行比较。它实际上并不是按字典顺序比较C字符串。您需要创建一个自定义比较函数,该函数按字典顺序比较字符串,例如:致电std::strcmp
bool compare(const char* s1, const char* s2)
{
return std::strcmp(s1, s2) < 0;
}
int main()
{
const char * str[5] = {"alpha", "gamma", "beta", "delta", "chi"};
int size = sizeof(str)/sizeof(*str);
std::sort(str, str + size, compare);
for (int i = 0; i < size; i++) std::cout << str[i] << ", ";
}
答案 1 :(得分:3)
问题很简单:您正在使用默认比较,它只是比较指针值。通常这些地址会有升序,所以你不会看到任何变化。
您必须编写自己的比较函数:
int comp(const char *c1, const char *c2) {
return strcmp(c1, c2) < 0;
}
std::sort(str, str + size, &comp);
答案 2 :(得分:2)
也许是因为const char *
的默认比较器正在比较指针值(并且字符串常量恰好以数组顺序分配)?
使用std::string
。