其他分享
首页 > 其他分享> > c – 对字符串数组进行不区分大小写的排序

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