按字符串的矢量对大小写单词进行排序

Sorting upper and lower case words in vector of strings

本文关键字:大小写 单词进 排序 字符串      更新时间:2023-10-16

我正在尝试按字符串向量中的单词的字母顺序排列,我的程序正在区分大写字母和小写字母,因此大写单词总是出现在排序列表的第一位。我可以想出一些可能非常麻烦的方法来确保大写单词的位置,但有简单的方法吗?

这是我的代码:

for (int i = 0; i < str.size(); i++)
    {
        for (int j = 0; j < str.size(); j++) 
        {
            if (str.at(i) > str.at(j))
            {               
                temp = str.at(j);
                str.at(j) = str.at(i);
                str.at(i) = temp;
            }   
        }
    }

此外,这是一个编程任务,所以我不允许使用内置的C++函数来完成这项工作,我必须使用向量。

解决这个问题的诀窍是为这行写一个替代品

if (str.at(i) > str.at(j))

执行不区分大小写的比较。首先为它写一个签名:

bool greaterThanIgnoreCase(const string& left, const string& right) {
    ...
}

现在,您可以用调用这个新函数来替换if条件:

if (greaterThanIgnoreCase(str.at(i), str.at(j)))

最后,您需要提供greaterThanIgnoreCase函数的实现。这是问题的核心,所以你需要自己做。它的诀窍是对字符串leftright的每个字符使用touppertolower函数,并一次比较一个字符。如果其中一个字符串中的字符用完,则应将剩余一些字符的字符串视为更大的字符串。

您唯一需要做的就是比较小写字符。如果不允许您使用任何内置函数,您可以手动使用。

由于ASCII表中的小写字符从97开始,大写字符从65开始,所以您可以简单地在大写字符上添加32来获得其小写等效字符。

char lowerCase(char c)
{
    if (c >= 'A' && c <= 'Z') // if char is uppercase
        return (char)(c + 32); // return its lowercase equivalent
    else
        return c;
}

然后,您可以在if条件下执行以下操作:

if (lowerCase(str.at(i)) > lowerCase(str.at(j)))

请注意,仅当进行比较时才应使用lowerCase,而不应在分配时使用。

这是正在工作的IDEOne演示。

如果您有strings的vector,那么您可以/应该使用STL库,该库为给定的比较函数(可以是简单的lambda表达式、函数、函数…)提供sortstable_sort

更新:除vector外,不允许使用内置类型。在这种情况下,您可以轻松地开发STL的复制功能。

定义一个接收比较器(用于字符串向量)的排序函数。