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

Why isn't my overloading < operator not working for STL sort

本文关键字:不适用 适用于 STL 排序 运算符 我的 重载 lt 为什么      更新时间:2023-10-16

我有下面的代码,我想根据字符串的最后一个字符对字符串的矢量进行排序。我已经完成了以下操作,但排序是按默认规则完成的。

这是过载<部件:

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;

视频中的代码:LINK

如前所述,您的operator<没有被调用,std::stringstd命名空间中已经重载了运算符。

std::sort有两个版本,一个使用operator<,另一个使用自定义谓词对容器进行排序。添加自定义谓词,您仍然可以根据需要使用sortvector进行排序;

#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);
});

它没有被使用,你必须将它传递到std::sort中——类似于:

sort(nameList.begin(), nameList.end(), [](const string &s1, const string &s2) {
    return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
相关文章: