为什么我的超载<运营商不为STL排序工作

时间:2014-09-22 11:38:36

标签: c++ stl operator-overloading

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

这是超载<部分:

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

2 个答案:

答案 0 :(得分:6)

如上所述,您的operator<未被调用,std::string已在std命名空间中重载了运算符。

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

答案 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);
}