为什么我的重载<运算符不能用于STL排序

0 c++ stl operator-overloading

我有以下代码,我想根据字符串的最后一个字符排序字符串向量.我已完成以下操作,但排序是通过默认规则完成的.

这是重载<部分:

bool operator<(const string &s1, const string &s2){
    return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
Run Code Online (Sandbox Code Playgroud)

这是主要的:

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;
Run Code Online (Sandbox Code Playgroud)

代码中的代码:LINK

Nia*_*all 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;
}
Run Code Online (Sandbox Code Playgroud)

我打电话给你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);
});
Run Code Online (Sandbox Code Playgroud)