创建比较函数以对 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);
我希望这段代码尽可能快,所以我不想使用向量或结构并将它们作为参考传递。
任何帮助将不胜感激。
//编辑对于不精确,我深表歉意。我不想重新实现字典排序,因为有一个 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 函数。或者,您可以直接使用它,注意正确返回布尔值。
相关文章:
- 对字符串进行排序时,在c++中处理sort()
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 字符串上的合并排序上的 Seg 错误
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- 如何在数组 c++ 中对字符串进行排序
- 提高从排序字符串中获取字母顺序的顺序复杂性
- 尝试使用C++中的模板进行BST排序,但在使用随机字符串进行测试时不起作用
- 如何根据第二列/第三列等对字符串向量进行排序?
- 如何对向量进行排序<浮点数,字符串>而不考虑字符串
- C ++中的字符串排序,也没有在第5个元素正确排序
- C++:使用 LSD 基数排序字符串排序崩溃
- C 样式的字符串排序与排序和 qsort
- 自定义字符串排序
- 编号和字符串排序Al
- 使用STL对子字符串排序
- 如何在c++中按字母顺序对标准输入字符串排序
- c++向量字符串排序不工作
- SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)