我有一个向量字符串,其中包含数字和单词:
vector<string> title
{
202 Physics
101 Math
303 Chemistry
}
我想用两种方式对它们进行排序:第一种是升序编号(即101 Math,202 Physics,303 Chemistry),第二种是升序字母/单词(即303 Chemistry,101 Math,202 Physics)。
我想到的解决方案是使用一个结构并将所有从此字符串向量中读取的条目读入该结构向量中,然后对其进行排序。
但是,这是针对学校作业的,要求我专门处理字符串向量。如何通过以上两种方式对字符串向量进行排序?
答案 0 :(得分:1)
std::sort
allows an optional comparator。一个简单的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); }
会切掉每个字符串的前四个字符,仅保留课程标题,然后比较其余部分。
答案 1 :(得分:1)
按第一个数字排序,然后按第一个字母字符排序。不假设字符串中的第一个数字和第一个字母char位于哪里(只要它们存在)。但是,请确保所有数字都具有相同的数字。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<string> vec{"202 Physics","101 Math","303 Chemistry"};
cout << "Original\n";
for (auto item : vec)
std::cout << item << " ";
cout << std::endl;
cout << "Sort by first digit\n";
std::sort(std::begin(vec ), std::end(vec ), [](string a, string b)
{return *find_if(a.begin(), a.end(), [](char c){return isdigit(c);})
< *find_if(b.begin(), b.end(), [](char c){return isdigit(c);}); });
for (auto item : vec)
std::cout << item << " ";
cout << std::endl;
cout << "Sort by first alphabetical char\n";
std::sort(std::begin(vec ), std::end(vec ), [](string a, string b)
{return *find_if(a.begin(), a.end(), [](char c){return isalpha(c);})
< *find_if(b.begin(), b.end(), [](char c){return isalpha(c);}); });
for (auto item : vec)
std::cout << item << " ";
cout << std::endl;
}
产生输出:
Original
202 Physics 101 Math 303 Chemistry
Sort by first digit
101 Math 202 Physics 303 Chemistry
Sort by first alphabetical char
303 Chemistry 101 Math 202 Physics