字符串的字典比较[不区分大小写]
Posted
技术标签:
【中文标题】字符串的字典比较[不区分大小写]【英文标题】:lexicographic comparison of strings [case-insensitive] 【发布时间】:2016-11-06 05:17:44 【问题描述】:我想按字典顺序对文件的文本进行排序,但我无法理解字典顺序的真正作用。
排序字符串会产生另一个问题;关系运算符使用 ASCII 值,所以
betty < Diane
在应该为真时为假。
考虑一个示例列表: 贝蒂,黛安,123 岁,安娜,梅根,查尔斯,二,12 岁。
如何按字典顺序设置?
【问题讨论】:
这比你想象的要容易:std::string
已经在使用字典比较。
你这是什么意思? @someprogrammerdude
如果您想学习而不是使用 STL 让事情变得更容易,请尝试实现自己的基数排序。
它不像我要求代码大声笑,只是想要一些解释
【参考方案1】:
方法:
-
使用
map <convert_to_lower_case(words) as string, index as integer>
将所有单词放入列表中。
然后使用以下命令创建一个排序向量myVec
:
for(it_type iterator = m.begin(); iterator != m.end(); iterator++)
myVec.push_back(original_list[it->second]);
myVec
是您要查找的按字典顺序排序的列表。
你需要实现convert_to_lower_case(word)
:
for(int i = 0; str[i]; i++)
word[i] = tolower(str[i]);
其他答案也不错,使用比较器对向量进行排序。
【讨论】:
【参考方案2】:这不是你想要的吗?
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>
int main()
std::vector<std::string> v "Diane", "123", "Ana", "Megan", "charles", "two", "12";
for (const auto& s : v)
std::cout << s << ' ';
;
std::cout << '\n';
std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b)
for (int i = 0 ; i < std::min(a.size(), b.size()) ; i++)
const auto a_char = std::tolower(a[i]);
const auto b_char = std::tolower(b[i]);
if (a_char != b_char)
return a_char < b_char;
return a.size() < b.size();
);
for (const auto& s : v)
std::cout << s << ' ';
;
std::cout << '\n';
return 0;
stdout 看起来像这样:
Diane 123 Ana Megan charles two 12
12 123 Ana charles Diane Megan two
【讨论】:
这是错误的。不是不区分大小写的搜索。阅读完整的问题。【参考方案3】:使用 compareToIgnoreCase 方法
【讨论】:
以上是关于字符串的字典比较[不区分大小写]的主要内容,如果未能解决你的问题,请参考以下文章