按字符串的矢量对大小写单词进行排序
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++函数来完成这项工作,我必须使用向量。
解决这个问题的诀窍是为这行写一个替代品
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
函数,并一次比较一个字符。如果其中一个字符串中的字符用完,则应将剩余一些字符的字符串视为更大的字符串。
您唯一需要做的就是比较小写字符。如果不允许您使用任何内置函数,您可以手动使用。
由于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演示。
如果您有string
s的vector
,那么您可以/应该使用STL库,该库为给定的比较函数(可以是简单的lambda表达式、函数、函数…)提供sort
或stable_sort
。
更新:除vector外,不允许使用内置类型。在这种情况下,您可以轻松地开发STL的复制功能。
定义一个接收比较器(用于字符串向量)的排序函数。
相关文章:
- 文本文件中的单词链表
- 如何在openssl-ecc中获取十六进制格式的私钥
- 在指针的帮助下,文本文件中单词的频率
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何根据单词在文本中出现的概率输出单词
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 从字符串变量中逐字符读取单词
- 使用std::mt19937从字符串中返回一个随机单词
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- clang格式:宏的缩进
- C++setiosflags函数操纵器-未确定的缩进
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 用c++把小数点转换成八进制
- 如何用for循环在c++中生成单词三角形
- 将数字转换为单词
- C++:如果用户输入数字将其转换为单词,并且如果按回车键程序应退出,则使用开关大小写
- 计算唯一单词的数量(大小写对此计数无关紧要)
- 按字符串的矢量对大小写单词进行排序