1

我知道我不应该使用 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] << ", ";

}

它根本不会改变数组。我做错了什么?

4

3 回答 3

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] << ", ";
}
于 2013-01-03T00:41:50.823 回答
3

问题很简单:您使用的是默认比较,它只会比较指针值。通常这些将有升序的地址,所以你不会看到任何变化。

您必须编写自己的比较函数:

int comp(const char *c1, const char *c2) {
    return strcmp(c1, c2) < 0;
}

std::sort(str, str + size, &comp);
于 2013-01-03T00:42:52.263 回答
2

可能是因为默认比较器const char *是比较指针值(并且字符串常量恰好已经按数组顺序分配)?

使用std::string.

于 2013-01-03T00:42:07.410 回答