[英]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.