我是 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/