首页 > 解决方案 > 对包含数字和单词的字符串向量进行排序

问题描述

我有一个包含数字后跟单词的字符串向量:

vector<string> title
{
202 Physics
101 Math
303 Chemistry
}

我想以两种方式对它们进行排序:第一种是升序数字(即 101 数学、202 物理、303 化学),第二种是升序字母/单词(即 303 化学、101 数学、202 物理)。

我想到的解决方案是使用一个结构并将所有条目从这个字符串向量读取到该结构向量中,然后对它们进行排序。

但是,这是针对要求我专门处理字符串向量的学校作业。如何以上述两种方式对字符串的向量进行排序?

标签: c++sortingvector

解决方案


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); })将两个字符串都转换为intstd::stoi在课程编号后遇到非数字空格字符时停止处理)并进行比较,同时[](const auto& a, const auto &b) { return a.substr(4) < b.substr(4); }切掉前四个每个字符串的字符,只留下课程标题,并比较其余部分。


推荐阅读