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

时间:2015-12-04 03:18:52

标签: c++ sorting alphabetical

我试图在字符串向量中按字母顺序排列单词,而我的程序区分大小写字母,因此大写单词总是首先出现在排序列表中。我可以想到可能真的很麻烦的方法来确保大写单词代替它们,但有一种简单的方法可以做到这一点吗?

这是我的代码:

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

3 个答案:

答案 0 :(得分:4)

解决这个问题的技巧是为这一行写一个替代品

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函数,并一次比较一个字符。如果其中一个字符串中的字符用完,那么剩下一些字符的字符应该被认为更大。

答案 1 :(得分:0)

如果您有vector string s,那么您可以/应该使用STL库,它为给定的比较功能提供sortstable_sort(可以是一个简单的lambda表达式,仿函数,函数,...)。

更新:除了vector之外,您不允许使用内置类型。 在这种情况下,您可以轻松地复制STL所做的事情。

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

答案 2 :(得分:0)

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

由于小写字符位于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,而不应在分配时使用{<1}}。

这是working IDEOne demo