c++ - 对包含数字和单词的字符串向量进行排序
问题描述
我有一个包含数字后跟单词的字符串向量:
vector<string> title
{
202 Physics
101 Math
303 Chemistry
}
我想以两种方式对它们进行排序:第一种是升序数字(即 101 数学、202 物理、303 化学),第二种是升序字母/单词(即 303 化学、101 数学、202 物理)。
我想到的解决方案是使用一个结构并将所有条目从这个字符串向量读取到该结构向量中,然后对它们进行排序。
但是,这是针对要求我专门处理字符串向量的学校作业。如何以上述两种方式对字符串的向量进行排序?
解决方案
std::sort
允许一个可选的比较器。一个简单的 lambda 函数允许您执行基本操作以根据字符串的不同组件进行比较。这是一个非常简单的最小示例,假设课程编号始终为三位数,后跟一个空格,因此您可以仅std::stoi
用于数字比较,以及substr
课程名称比较的方法:
int main()
{
std::vector<std::string> title{"202 Physics"s, "101 Math"s, "303 Chemistry"s};
std::sort(title.begin(), title.end(), [](const auto& a, const auto &b) { return std::stoi(a) < std::stoi(b); });
std::cout << "By number" << std::endl;
for (auto&& s : title) {
std::cout << s << std::endl;
}
std::sort(title.begin(), title.end(), [](const auto& a, const auto &b) { return a.substr(4) < b.substr(4); });
std::cout << std::endl << "By title" << std::endl;
for (auto&& s : title) {
std::cout << s << std::endl;
}
return 0;
}
在每种情况下,比较器都会true
在左侧元素小于右侧元素时返回,因此[](const auto& a, const auto& b) { return std::stoi(a) < std::stoi(b); })
将两个字符串都转换为int
(std::stoi
在课程编号后遇到非数字空格字符时停止处理)并进行比较,同时[](const auto& a, const auto &b) { return a.substr(4) < b.substr(4); }
切掉前四个每个字符串的字符,只留下课程标题,并比较其余部分。
推荐阅读
- javascript - 如何创建 JWT?
- python - add_format 与 xlsxwriter 无法按预期工作
- java - Java 如果我有一个 javax.servlet.http.Part 数组,那么一个部分是否总是代表一个文件
- 3d - 如何修复 3D 平台游戏的跳转代码?
- reporting-services - 在 SSRS 文本段落中添加超链接
- powershell - 获取无法将“System.Object []”转换为 Add-PowerBIRow 的参数“DatasetId”所需的类型“System.Guid”
- winapi - postmessage return 传递给系统调用的数据区域太小
- excel - excel - 如果公式条件
- regex - 删除文件中两个字符串匹配项之间的所有内容
- ruby-on-rails - Sidekiq 过去曾将工作排入队列