在c ++中查找stl集合中的项目

时间:2010-03-04 23:00:52

标签: 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 [作者] = obj;

确实有效。然而,

这是一个问题,因为它将两本不同书籍的作者视为副本。 所以,它只会返回一本书。

我能做什么..请记住,我无法更改功能或设置。所以,任何const都必须留下......但可以制作一套新的。

4 个答案:

答案 0 :(得分:1)

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

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

答案 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。

您还可以使用计数方法计算相似键的数量。