2015-04-02 30 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; 
相关问题