对字符串向量中的大写和小写单词进行排序

Sorting upper and lower case words in vector of strings

我正在尝试按字母顺序排列字符串向量中的单词,我的程序区分大写字母和小写字母,因此大写单词始终出现在排序列表中的第一个。我可以想出一些非常麻烦的方法来确保大写单词就位,但是有没有一种简单的方法可以做到这一点?

这是我的代码:

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++ 函数来执行此操作,我必须使用矢量。

如果您有 vectorstring,那么您 could/should 使用 STL 库,它提供 sortstable_sort 进行给定比较函数(可以是简单的 lambda 表达式、仿函数、函数...)。

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

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

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

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 的每个字符使用 toupper or tolower 函数,并一次比较它们一个字符。如果您 运行 超出了其中一个字符串中的字符,则应考虑剩余一些字符的字符串更大。

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

由于小写字符在 ASCII table 中的位置从 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,而不是在分配时使用。

这里是 working IDEOne demo.