创建比较函数以对 C 样式字符串进行排序

Creating a comparison function to sort C-style strings

本文关键字:字符串 排序 样式 比较 函数 创建      更新时间:2023-10-16

我想对 C 样式字符串数组进行排序,但我不知道如何正确创建比较函数。

//the array
char foo[2][4] = { "abc", "cde" };
//the comparison function
bool cmp(char * a, char * b) //<- actually passing parameters causes trouble
{
    for (int i = 0; i < 4; i++)
        if (a[i] < b[i])
            return true;
        else if (a[i] > b[i])
            return false;
    return true;
}
//sorting
std::sort(foo, foo + 2, &cmp);

我希望这段代码尽可能快,所以我不想使用向量或结构并将它们作为参考传递。

任何帮助将不胜感激。

//编辑对于不精确,我深表歉意。我不想重新实现字典排序,因为有一个 STL 函数可以适当地执行此操作。比较部分并不重要。我只是想访问字符串的元素(在本例中为"字母"(,做任何我想做的事情,并通过返回 true 或 false 来影响 std::sort 函数。

查看评分最高的响应:c++ 使用结构排序我想对 C 字符串数组(不是结构(做同样的事情 - 比较本身并不重要。

您无法对foo数组进行排序,因为它是二维数组。 std::sort要求数组的元素是可分配的。但是foo的元素是一维数组,数组不能被赋值。

如果您改为foo指针数组,则可以对其进行排序:

const char *foo[2] = { "abc", "cde" };

您还需要使cmp接受const char *指针而不是char *

bool cmp(const char * a, const char * b)

其他选择是使foo的元素std::array<char, 4>,或包含char[4]成员的结构。使用 std::string 是最推荐的选项,除非您有充分的理由避免使用它。

另一件需要修复的事情:您的 cmp 函数在传递两个相等元素时返回true。它应该返回false

请注意,您可以利用 strcmp 函数,而不是实现 cmp

bool cmp(const char * a, const char * b) {
    return std::strcmp(a, b) < 0;
}
bool cmp(char * a, char * b) //<- actually passing parameters causes trouble
{
int lena = strlen(a);
int lenb = strlen(b) ;   
for (int i = 0; i < lena && i < lenb; i++)
        if (a[i] != b[i])
            return a[i]<b[i];
if ( lena<lenb ) return true;
return false;
}

你基本上需要重新实现 strcmp 函数。或者,您可以直接使用它,注意正确返回布尔值。