1

我想对一组 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++ sort with structs 我想对一组 C 字符串(不是结构)做同样的事情——比较本身并不重要。

4

2 回答 2

3

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

如果您foo改为创建一个指针数组,您将能够对其进行排序:

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

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

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

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

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

请注意cmp,您可以利用以下strcmp功能,而不是您的实现:

bool cmp(const char * a, const char * b) {
    return std::strcmp(a, b) < 0;
}
于 2013-06-05T15:13:27.690 回答
-1
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 函数。或者,您可以直接使用它,注意正确返回布尔值。

于 2013-06-05T14:38:56.950 回答