帮助set&在STL上映射c ++

时间:2010-02-24 00:04:25

标签: c++

我正在参加CS课程,大部分作业都是在java中。在上一次java赋值中,我们学习了集合。我们使用c ++进行这项任务,我需要学习STL 所需的书都是java。我们获得了此网页http://www.cplusplus.com/ 然而,那和谷歌不会让我完成任务。 你能推荐一本关于STL和c ++的好书吗?我需要主要了解集合和地图。

此作业涉及媒体库(书籍,CD,DVD信息)

我们获得了一个骨架程序,在图书馆课程中工作,我不知道该集合和地图实际上是针对书籍,CD,DVD信息的内容。有人可以根据函数告诉我什么进入set / map?

typedef set<Item*>             ItemSet;
typedef map<string,Item*>       ItemMap;
typedef map<string,ItemSet*>     ItemSetMap;

class Library
{

public:
// general functions

void addKeywordForItem(const Item* const item, const string& keyword);
const ItemSet* itemsForKeyword(const string& keyword) const;
void printItem(ostream& out, const Item* const item) const;

// book-related functions

const Item* addBook(const string& title, const string& author, int const nPages);
const ItemSet* booksByAuthor(const string& author) const;
const ItemSet* books() const;

// music-related functions

const Item* addMusicCD(const string& title, const string& band, const int nSongs);
void addBandMember(const Item* const musicCD, const string& member);
const ItemSet* musicByBand(const string& band) const;
const ItemSet* musicByMusician(const string& musician) const;
const ItemSet* musicCDs() const;

// movie-related functions

const Item* addMovieDVD(const string& title, const string& director, const int nScenes);
void addCastMember(const Item* const movie, const string& member);
const ItemSet* moviesByDirector(const string& director) const;
const ItemSet* moviesByActor(const string& actor) const;
const ItemSet* movies() const;
};

3 个答案:

答案 0 :(得分:1)

我发现STL Tutorial and Reference Guide对于了解基本的STL数据结构非常有用并且非常有帮助。

答案 1 :(得分:1)

好的,关键问题是您需要支持哪些操作。这些操作决定了你应该使用哪种数据结构。

例如,对于您拥有的书籍:

const Item* addBook(const string& title, const string& author, int const nPages);
const ItemSet* booksByAuthor(const string& author) const;
const ItemSet* books() const;

这意味着您需要一套书:所有书籍和作者。因此,您需要一张将作者映射到具有该作者的书籍集的地图。

您的功能可能如下所示:

ItemSet allBooks;
ItemSetMap allBooksByAuthor;
...

const Item* addBook(const string& title, const string& author, int const nPages)
{
    BookItem* item = new BookItem(...);
    allBooks.insert(item); // add to set of all books
    allBooksByAuthor[author].insert(item); // add to set of books by this author
    return item;
}

const ItemSet* booksByAuthor(const string& author) const
{
    return allBooksByAuthor[author];
}

const ItemSet* books() const
{
    return allBooks;
}

答案 2 :(得分:0)

“好书”部分已在别处处理 - 例如here

明显缺少的细节是“Item”类型的定义。基于“add”函数,它可能只包含三个字段 - 两个字符串和一个int。

“set”是一组指向项目的指针。它用于查询函数的结果 - 您的结果基本上是唯一记录的排序集,因为一个集合包含一个排序的唯一项目序列。

“map”是从字符串到项目指针的映射。大多数最有可能用于“索引”您的数据项。地图包含(键,数据)对,键被排序且唯一。您可能会使用此类型的某些私有成员数据来保存“添加”方法中的数据。由于密钥是唯一的,因此该索引仅适用于没有重复的密钥。

“map”遵循与之前相同的原则,但有一些额外的曲折,因为(键,数据)对的数据部分是指向一组项目的指针。同样是数据项的索引,但通过为每个键保存一组结果来允许重复。

这很奇怪 - 您通常使用多重映射来直接复制。我猜测为什么不是你没有为迭​​代器做好准备。实际上,您应该能够使用“insert”方法和(对于地图)“[]”下标运算符来实现这些方法。