如何将比较谓词函数命名为sort vector

时间:2011-11-23 05:47:28

标签: c++

我是C ++的初学者,对于排序类对象的向量有疑问。我在网上做了很多研究,但似乎无法找到答案。我的问题是我希望有多个谓词比较函数,我可以命名,因为我需要让用户能够从菜单中选择要对其进行排序的向量的私有成员变量/组件。我能够使用重载运算符获得谓词比较函数以正常工作,但是当我尝试命名函数时,我似乎无法在没有一堆错误的情况下编译它(我会发布更远的错误)在适当的代码下面。)

当代码运行时,BookData对象的向量由读取文本文件的函数创建。主要功能原型:

vector<BookData> createVector();

main中的函数调用:

vector<BookData> books = createVector();

createVector函数定义:

vector<BookData> createVector()
{
    const int LENGTH = 81;
    char input[LENGTH];
    vector<BookData> fBooks;
    string vBookTitle, vIsbn, vAuthor, vPublisher, vDateAdded;
    int vQtyOnHand;
    double vWholesale, vRetail;
    BookData *books1;
    books1 = new BookData;
    fstream dataFile("Serendipity.data");
    if (dataFile.is_open())
    {
        while (!dataFile.eof())
        {
            dataFile.getline(input, LENGTH, '\t');
            vBookTitle = input;
            books1->setTitle(vBookTitle);
            dataFile.getline(input, LENGTH, '\t');
            vAuthor = input;
            books1->setAuthor(vAuthor);
            dataFile.getline(input, LENGTH, '\t');
            vPublisher = input;
            books1->setPub(vPublisher);
            dataFile.getline(input, LENGTH, '\t');
            vIsbn = input;
            books1->setIsbn(vIsbn);
            dataFile >> vQtyOnHand;
            books1->setQty(vQtyOnHand);
            dataFile >> vWholesale;
            books1->setWholesale(vWholesale);
            dataFile >> vRetail;
            books1->setRetail(vRetail);
            dataFile.ignore();
            dataFile.getline(input, LENGTH);
            vDateAdded = input;
            books1->setDateAdded(vDateAdded);
            fBooks.push_back(*books1);
        }
    }
    return fBooks;
}

这是我的类定义文件(bookdata.h),带有工作比较功能:

class BookData
{ 
private:
        string bookTitle, isbn, author,
            publisher, dateAdded;
        int qtyOnHand;
        double wholesale, retail;
        bool empty;     

public:
    BookData();
    bool operator< (BookData rhs);
    void printVector();
    void setTitle(string);
    void setIsbn(string);
    void setAuthor(string);
    void setPub(string);
    void setDateAdded(string);
    void setQty(int);
    void setWholesale(double);
    void setRetail(double);
    int isEmpty();
    void insertBook();
    void removeBook();
    string getTitle();
    string getIsbn();
    string getAuthor();
    string getPublisher();
    string getDateAdded();
    int getQtyOnHand();
    double getWholesale();
    double getRetail();
};

这是类实现文件(bookdata.cpp)中的工作函数:

bool BookData::operator< (BookData rhs)
{
    return qtyOnHand < rhs.qtyOnHand;
}

从int main()中调用它是这样的:

sort (books.begin(), books.end());

但是,如果我尝试命名该功能:

bool compare (BookData rhs);
从类定义文件中

并在类实现文件中将其更改为:

bool BookData::compare (BookData rhs)
{
    return qtyOnHand < rhs.qtyOnHand;
}

并在main中更改向量排序函数:

sort (books.begin(), books.end(), &BookData::compare);

我从编译器收到错误消息:

错误C2064:术语不评估为采用2个参数的函数

关于如何正确命名/调用sort函数的任何建议?

3 个答案:

答案 0 :(得分:1)

Compare不应该是该类的成员(或者如果它是static成员,或者friend,如果它访问受限制的字段),它应该接受要比较的值(而operator <使用this作为左值。)

类似的东西:

bool compare (BookData lhs, BookData rhs)
{
    return lhs.qtyOnHand < rhs.qtyOnHand;
}

使用operator<是恕我直言,更好的方法。

答案 1 :(得分:0)

BTW,建议通过引用传递而不是参数的传值,如下所示:

bool compare (const BookData &lhs, const BookData &rhs)
{
  // implementation.
}

答案 2 :(得分:0)

我建议将谓词创建为函数对象:

struct compare
{
    bool operator()(const BookData& x, const BookData& y) const
    {
        return x < y;
    }
};

请注意const末尾的operator()。您可以按如下方式将此对象传递给STL算法:

sort (books.begin(), books.end(), compare());

如果您不想每次都创建函数对象,可以在BookData中将其包含为(静态)成员。