2015-04-02 35 views
0

我有一個類。其定義如下:根據類中的字符串對用戶定義類的向量進行排序

using namespace std; 

class Token 
{ 
    private: 
     string token; 
     vector<string> field; 

    public: 
     void setToken(string s); 
     string getToken();  
     void setField(string temp); 
     string getField(int i); 
     int getsize(); 
}; 

我現在有一個這些對象的向量。 (vector<Token> myobjs) 我想根據其中的string token(私有變量)對此向量排序。 我用我自己的比較函數來排序是矢量

bool compare(const vector<Token>&a, const vector<Token>&b) 
{ 
    if(a.getToken() < b.getToken()) 
    return true; 
    return false; 
} 

vector<Token> delim; 

這是不是叫sort(delim.begin(), delim.end(), compare)的方式嗎?

+1

,如果是沒用的,你可以'返回a.getToken() Borgleader 2015-04-02 17:10:22

+0

錯誤:'const class std :: vector '沒有名爲'getToken'的成員彈出 – sad 2015-04-02 17:13:41

+2

@S rinathKattula,這應該是在問題本身,而不是評論。 – Hiura 2015-04-02 17:14:18

回答

1

你並不需要比較的token載體,你需要比較token

bool compare(const Token&a, const Token&b) 
{ 
    return a.getToken() < b.getToken(); 
} 

當然什麼其他的答案已經說的和,getToken需要被標記爲const

string getToken() const; 
1

由於Borgleader提到你可以簡化你的謂詞,儘管這裏不是問題。你實際上需要比較Token

bool compare(const Token& a, const Token& b) 
{ 
    return a.getToken() < b.getToken(); 
} 

您遇到的問題是,你的謂詞的ab參數是不變的,所以你不能對它們調用的函數成員可能會發生變異他們。

爲了解決這個問題,你必須標記你的類的吸氣劑恆:

class Token 
{ 
    private: 
     string token; 
     vector<string> field; 

    public: 
     void setToken(string s); 
     string getToken() const; // edited 
     void setField(string temp); 
     string getField(int i) const; // edited too 
     int getsize() const; // edited too 
}; 

順便說一句,你也可以使用拉姆達而不是創建一個函數。在C++ 14你可以寫:

sort(delim.begin(), delim.end(), 
    [](auto const& a, auto const& b) { return a.getToken() < b.getToken(); } 
); 
2

你需要比較單一的對象,而不是載體:

bool compare(const Token & a, const Token & b) { 
    return a.getToken() < b.getToken(); 
} 

這需要getTokenconst

string getToken() const; 
相關問題