繁体   English   中英

创建一个比较函数来对C样式的字符串进行排序

[英]Creating a comparison function to sort C-style strings

我想对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);

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

任何帮助将不胜感激。

// edit我为不准确表示歉意。 我不想重新实现字典排序,因为有一个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 ,否则最好使用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函数。 另外,您可以直接使用它,请注意正确返回布尔值。

暂无
暂无

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

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