我正在尝试在一组中找到一位作者,我遇到了这样的问题。
在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 [作者] = obj;
确实有效。然而,
这是一个问题,因为它将两本不同书籍的作者视为副本。 所以,它只会返回一本书。
我能做什么..请记住,我无法更改功能或设置。所以,任何const都必须留下......但可以制作一套新的。
答案 0 :(得分:1)
您需要使用多集而不是集合。
答案 1 :(得分:1)
std::map
仅限于为每个唯一键(作者)仅允许一个值。如果您希望每个键/作者有多个值,那么您应该使用std::multimap
。
答案 2 :(得分:0)
如何在插入之前检查作者是否在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中,而不是总是用一个项目创建一个新的。
我还要指出,让你的ItemSet包含Item *而不是Item的集合,它只会确保你没有在那里持有相同的指针。您仍可以在ItemSet中拥有相同的项目。您需要直接保存项目(在这种情况下不起作用,因为指向的Items实际上是Item的子类)或者如果要保证它不包含重复项目,则给它一个自定义比较器
答案 3 :(得分:0)
您应该使用 multiset / multimap 和 equal_range 方法而不是find。 equal_range 返回一对迭代器。 pair.first 是您要搜索的第一件事,而 pair.second 首先是您搜索的最后一件事。
你可以迭代pair.first直到pair.second。
您还可以使用计数方法计算相似键的数量。