c++ - 如何命名比较谓词函数来排序 vector

标签 c++

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

代码运行时,BookData 对象的 vector 由读取文本文件的函数创建。 main函数原型(prototype):

vector<BookData> createVector();

主函数调用:

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 中更改 vector 排序函数:

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

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

error C2064: term 的计算结果不是带 2 个参数的函数

关于如何正确命名/调用排序函数有什么建议吗?

最佳答案

Compare不应该是该类的成员(或者是 static 成员或 friend 如果它访问受限字段),并且它应该接受两个值进行比较(而 operator < 使用 this 作为左值).

像这样:

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

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

关于c++ - 如何命名比较谓词函数来排序 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237827/

相关文章:

c++ - while 循环不终止?

C++ “was not declared in this scope” 编译错误

c++ - 当应用程序菜单具有焦点时,消息循环被阻塞

c++11 获取第一个(第二个等...)参数的类型,类似于 result_of

c++ - 未初始化的 int 值始终相同 (C++)

c++ - 为什么 ()、[]、-> 和 = 必须仅作为成员函数重载?

c++ - Oracle OCI 将无效的 UTF8 字符更改为 U+FFFD

C++ 指针——奇怪的循环行为

c++ - 此 C++ 代码如何返回 0,0,3

c++ - 就地重新初始化对象