簡體   English   中英

在C ++中設置的stl中查找項目

[英]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;

它確實有效。 然而,

這是一個問題,因為它會將兩本不同書籍的作者視為重復。 因此,它只會返回一本書。

我該怎么辦..請記住,我無法更改功能或設置。 因此,任何常量都必須保留...但是可以進行新的設置。

您需要使用多集而不是集合。

http://www.cplusplus.com/reference/stl/multiset/

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 / multimapequal_range方法而不是find。 equal_range返回一對迭代器。 pair.first是您正在搜索的第一件事和pair.second第一件事情超出你要搜索的最后一件事。

您可以迭代pair.first直到pair.second。

您也可以使用count方法計算相似密鑰的數量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM