我有以下代码,我想根据字符串的最后一个字符对字符串向量进行排序。我已完成以下操作,但排序是按默认规则完成的。
这是超载<部分:
bool operator<(const string &s1, const string &s2){
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
这是主要的:
vector <string> nameList;
int n;
cin>>n;
while(n--){
string name;
char str[100];
cin>>str;
name += str;
nameList.push_back(name);
}
sort(nameList.begin(), nameList.end());
for(int i = 0; i < nameList.size(); i++)
cout<<nameList.at(i)<<endl;
ideone中的代码:LINK
答案 0 :(得分:6)
如上所述,您的operator<
未被调用,std::string
已在std
命名空间中重载了运算符。
std::sort
有两个版本,一个使用operator<
,另一个使用自定义谓词对容器进行排序。
添加自定义谓词,您仍然可以根据需要使用sort
对vector
进行排序;
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
bool lastchar(const string &s1, const string &s2){
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
int main(){
vector <string> nameList;
int n;
cin>>n;
while(n--){
string name;
char str[100];
cin>>str;
name += str;
nameList.push_back(name);
}
sort(nameList.begin(), nameList.end(), &lastchar);
for(int i = 0; i < nameList.size(); i++)
cout<<endl<<nameList.at(i);
return 0;
}
我称之为lastchar
,但您可以将其命名为最佳状态。另外,如果您可以使用C ++ 11或更高版本,则可以将谓词设为lambda。
sort(nameList.begin(), nameList.end(), [] (const string &s1, const string &s2){
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
});
答案 1 :(得分:3)
它没有被使用,你必须将它传递给std::sort
- 类似于:
sort(nameList.begin(), nameList.end(), [](const string &s1, const string &s2) {
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}