根据类中的字符串排序用户定义类的向量

时间:2015-04-02 17:09:46

标签: c++ sorting vector stl

我上课了。定义如下:

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)的方法吗?

3 个答案:

答案 0 :(得分:2)

您需要比较单个对象,而不是向量:

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

这需要getTokenconst

string getToken() const;

答案 1 :(得分:1)

您无需比较token的向量,您需要比较token

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

当然其他答案已经说过,getToken需要标记为const

string getToken() const;

答案 2 :(得分:1)

正如Borgleader所提到的,你可以稍微简化你的谓词,即使这不是问题。您实际上需要比较Token s。

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

您遇到的问题是谓词的ab参数是常量,因此您无法调用可能会使其变异的函数成员。

要解决这个问题,你必须将你的类的getter标记为常量:

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
};
顺便说一句,你也可以使用lambda代替创建一个函数。在C ++ 14中,您可以编写:

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