gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:30 25 4
gpt4 key购买 nike

基本上,我必须使用选择排序来对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com