[英]find an item in a stl set in c++
我試圖在一個集合中找到一位作者,但這樣做遇到了麻煩。
在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;
它確實有效。 然而,
這是一個問題,因為它會將兩本不同書籍的作者視為重復。 因此,它只會返回一本書。
我該怎么辦..請記住,我無法更改功能或設置。 因此,任何常量都必須保留...但是可以進行新的設置。
您需要使用多集而不是集合。
std::map
限於每個唯一鍵(作者)僅允許一個值。 如果您希望每個鍵/作者有多個值,則應使用std::multimap
。
如何在插入作者之前檢查作者是否在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,則為其提供自定義比較器。
您應該使用multiset / multimap和equal_range方法而不是find。 equal_range返回一對迭代器。 該pair.first是您正在搜索的第一件事和pair.second第一件事情超出你要搜索的最后一件事。
您可以迭代pair.first直到pair.second。
您也可以使用count方法計算相似密鑰的數量 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.