【问题标题】:Creating a comparison function to sort C-style strings创建一个比较函数来对 C 风格的字符串进行排序
【发布时间】:2013-06-01 07:34:41
【问题描述】:

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

【问题讨论】:

  • @ShamimHafiz 问题标记为 C++。
  • 我不明白,如果它们相等并且它们的第一个字符不相等,它将返回true。
  • 如何将参数传递给您的cmp 函数会导致问题?
  • @jonhopkins std::sort 需要一个开始和结束迭代器。
  • 比较功能不是您唯一的问题。您无法对 foo 进行排序,因为它的元素不可分配。

标签: c++ arrays sorting comparison


【解决方案1】:

您无法对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&lt;char, 4&gt;,或包含char[4] 成员的结构。使用std::string 是最推荐的选项,除非您有充分的理由避免使用它。

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

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

bool cmp(const char * a, const char * b) {
    return std::strcmp(a, b) < 0;
}

【讨论】:

  • 是的,这绝对有道理。我刚刚尝试过,你是对的。非常感谢。
【解决方案2】:
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 函数。或者,您可以直接使用它,注意正确返回布尔值。

【讨论】:

  • 实际上,您的函数将只比较字符串的第一个字符。
  • 为什么要错误地重新实现库函数?
  • return lena &lt; lenb;比较清楚。您也可以将参数作为 const 传递。
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多