我试图在一个集合中找到一位作者,但这样做遇到了麻烦。
在library.cpp中是我从main()添加信息的地方
#include "Library.h"
#include "book.h"
#include "cd.h"
#include "dvd.h"
#include <iostream>
// general functions
ItemSet allBooks;
ItemSet allCDS;
ItemSet allDVDs;
ItemSetMap allBooksByAuthor;
ItemSetMap allmoviesByDirector;
ItemSetMap allmoviesByActor;
ItemSetMap allMusicByBand;
ItemSetMap allMusicByMusician;
const Item* Library::addBook(const string& title, const string& author, const int nPages)
{
ItemSet* obj = new ItemSet();
Book* item = new Book(title,author,nPages);
allBooks.insert(item); // add to set of all books
obj->insert(item);
allBooksByAuthor[author] = obj;
return item;
}
const ItemSet* Library::booksByAuthor(const string& author) const
{
return allBooksByAuthor[author];
}
我希望能够归还特定作者的所有书籍。现在我要添加它们
allBooksByAuthor [author] = obj;
它确实有效。然而,
这是一个问题,因为它会将两本不同书籍的作者视为重复。
因此,它只会返回一本书。
我该怎么办..请记住,我无法更改功能或设置。因此,任何常量都必须保留...但是可以进行新的设置。
最佳答案
如何在插入作者之前检查作者是否在allBooksByAuthor中?
allBooksByAuthor[author] = obj;
将替换其中已经存在的ItemSet *。因此,您的ItemSet中将永远只有一个Item *。怎么样呢
ItemSetMap::iterator authorsBooks = allBooksByAuthor.find(author);
if(authorsBooks != allBooksByAuthor.end())
{
authorsBooks->second->insert(item);
}
else
{
allBooksByAuthor.insert(make_pair(author, obj));
}
这样,您可以将新的Item添加到现有的ItemSet中,而不是始终创建一个包含一个Item的新ItemSet。
我还要指出,通过让您的ItemSet包含Item *而不是Item的集,只会确保您没有在其中持有相同的指针。您的ItemSet中仍然可以有相同的Items。您需要使它直接持有Items(在这种情况下将不起作用,因为所指向的Items实际上是Item的子类),或者如果您想确保它不包含重复的Items,则为其提供自定义比较器。