我试图在字符串向量中按字母顺序排列单词,而我的程序区分大小写字母,因此大写单词总是首先出现在排序列表中。我可以想到可能真的很麻烦的方法来确保大写单词代替它们,但有一种简单的方法可以做到这一点吗?
这是我的代码:
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 ++函数来执行此操作,我必须使用向量。
答案 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
函数的实现。这是问题的核心,所以你需要自己做。其诀窍是在字符串left
和right
的每个字符上使用toupper
或tolower
函数,并一次比较一个字符。如果其中一个字符串中的字符用完,那么剩下一些字符的字符应该被认为更大。
答案 1 :(得分:0)
如果您有vector
string
s,那么您可以/应该使用STL库,它为给定的比较功能提供sort
或stable_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}}。