c – 对字符串数组进行不区分大小写的排序
作者:互联网
基本上,我必须使用选择排序来对字符串[]进行排序.我已经完成了这部分,但这是我遇到的困难.
然而,这种类型应该不区分大小写,因此“天线”将出现在“木星”之前. ASCII从大写到小写排序,那么是不是只能交换排序字符串的顺序?还是有一个更简单的解决方案?
void stringSort(string array[], int size) {
int startScan, minIndex;
string minValue;
for(startScan = 0 ; startScan < (size - 1); startScan++) {
minIndex = startScan;
minValue = array[startScan];
for (int index = startScan + 1; index < size; index++) {
if (array[index] < minValue) {
minValue = array[index];
minIndex = index;
}
}
array[minIndex] = array[startScan];
array[startScan] = minValue;
}
}
解决方法:
C为您提供sort
,它具有比较功能.在你的情况下,矢量< string>你将比较两个字符串.如果第一个参数较小,则比较函数应返回true.
对于我们的比较函数,我们希望在应用tolower
之后找到字符串之间的第一个不匹配字符.要做到这一点,我们可以使用mismatch
,只要两个字符相等,它就会在两个字符之间返回true:
const auto result = mismatch(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend(), [](const unsigned char lhs, const unsigned char rhs){return tolower(lhs) == tolower(rhs);});
为了确定lhs是否小于用于不匹配的rhs,我们需要测试3件事:
>是不等长的字符串
>字符串lhs更短
>或者是来自lhs的第一个不匹配的字符小于来自rhs的第一个不匹配的字符
该评估可以通过以下方式执行:
result.second != rhs.cend() && (result.first == lhs.cend() || tolower(*result.first) < tolower(*result.second));
最终,我们想要将它包装在lambda中并将其插回作为我们的比较器排序:
sort(foo.begin(), foo.end(), [](const unsigned char lhs, const unsigned char rhs){
const auto result = mismatch(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend(), [](const unsigned char lhs, const unsigned char rhs){return tolower(lhs) == tolower(rhs);});
return result.second != rhs.cend() && (result.first == lhs.cend() || tolower(*result.first) < tolower(*result.second));
});
这将正确排序矢量< string> FOO.你可以在这里看到一个实例:http://ideone.com/BVgyD2
编辑:
刚看到你的问题更新了.您也可以使用sort with string array [].你只需要像这样调用它:sort(array,std :: next(array,size),…
标签:c,sorting,string,case-insensitive 来源: https://codeday.me/bug/20190824/1707647.html