2014-09-22 90 views
0

我有以下代碼,我想根據字符串的最後一個字符對字符串的向量進行排序。我已經完成了以下操作,但排序是按默認規則完成的。爲什麼不是我的重載<運算符不適用於STL排序

這裏的超載<部分:

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

你確定它被稱爲?你的'operator <'是嗎? – Niall 2014-09-22 11:40:43

+4

字符串類[已經有一整套比較運算符](http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp)。相反,您可能需要使用['std :: sort'](http://en.cppreference.com/w/cpp/algorithm/sort)函數,您可以在其中提供自己的謂詞(並將其命名爲更合適的名稱) 。 – 2014-09-22 11:41:29

+0

@JoachimPileborg謝謝!現在通過使用帶有std :: sort [New Code IDEONE](http://ideone.com/OzCeV1)的函數來工作。 – 2014-09-22 11:49:36

回答

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

感謝您展示第二種類型(lambda)。 – 2014-09-22 12:02:18

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); 
} 
相關問題