c++ - 对字符串数组进行不区分大小写的排序

标签 c++ string sorting case-insensitive

基本上,我必须使用选择排序来对 string[] 进行排序。我已经完成了这部分,但这是我遇到的困难。

但是,排序应该不区分大小写,这样“天线”就会排在“Jupiter”之前。 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 它采用比较功能。在你的情况下 vector<string>您将比较两个字符串。比较函数应返回 true如果第一个参数较小。

对于我们的比较函数,我们希望找到 string 之间的第一个不匹配字符在 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喂给 mismatch我们需要测试三件事:

  1. string不等长的s
  2. string lhs更短
  3. 或者是第一个不匹配的char来自 lhs小于第一个不匹配的 char来自 rhs

可以通过以下方式执行此评估:

result.second != rhs.cend() && (result.first == lhs.cend() || tolower(*result.first) < tolower(*result.second));

最终,我们希望将其包装在一个 lambda 表达式中并将其插回 sort作为我们的比较器:

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));
});

这将正确排序 vector<string> foo .你可以在这里看到一个活生生的例子:http://ideone.com/BVgyD2

编辑:

刚刚看到您的问题更新。您可以使用 sortstring array[]以及。你只需要这样调用它:sort(array, std::next(array, size), ...

关于c++ - 对字符串数组进行不区分大小写的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33379846/

相关文章:

c++ - 静态成员函数的局部变量

c++ - libpqxx:连接进程终止后如何重新连接到 Postgresql 数据库

gets() 函数中的 CR 字符

Java 在循环中迭代字符串数组并一次返回

c - 按我的语言环境的字母顺序排列

C++ 我将如何使用 sort 对这个二维数组进行排序?

c++ - 需要 C++ 使用 map 来跟踪输入文件中的单词的帮助

c++ - 使用 new 并能够检查指针是否为 0(空)

algorithm - 如何在 block 排序中对数组后缀进行排序

SQL:固定行和行号计算