我试图在一个集合中找到一位作者,但这样做遇到了麻烦。

在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,则为其提供自定义比较器。

10-04 23:32