繁体   English   中英

为什么std :: sort不按字母顺序排列字符串数组?

[英]Why isn't std::sort alphabetizing an array of strings?

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

}

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

默认的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] << ", ";
}

问题很简单:您正在使用默认比较,它将只比较指针值。 通常,这些地址的地址会升序,因此您不会看到任何更改。

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

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

std::sort(str, str + size, &comp);

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

使用std::string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM