基本上,我必须使用选择排序来对 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
我们需要测试三件事:
- 是
string
不等长的s - 是
string lhs
更短 - 或者是第一个不匹配的
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
编辑:
刚刚看到您的问题更新。您可以使用 sort
与 string array[]
以及。你只需要这样调用它:sort(array, std::next(array, size),
...
关于c++ - 对字符串数组进行不区分大小写的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33379846/