帮助set & map on STL for c++


help with set & map on STL for c++

我参加CS班,大部分作业都在爪哇。在最后一个Java任务中,我们学习了集合。这个作业我们使用C++,我需要学习STL所需的书都是用Java编写的。我们的网页是http://www.cplusplus.com。/不过,这和谷歌不会让我完成任务。你能推荐一本关于STL和C++的好书吗?我需要主要学习布景和地图。

此作业是关于媒体库(书籍、CD、DVD信息)

我们有一个框架程序可以使用,在图书馆的课程中,我不确定这个集合和映射实际上是为了什么,关于图书、CD、DVD信息的内容……有人能根据函数告诉我什么进入了什么集合/映射吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
};

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

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

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

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

您的函数可能如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}


我发现STL教程和参考指南对于了解基本的STL数据结构既具有决定性,也非常有帮助。


"好书"部分已在其他地方处理过,例如这里。

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

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

"map"是从字符串到项指针的映射。最有可能用于"索引"数据项。映射包含(键、数据)对,这些键被排序并唯一。可能会有一些私有成员数据使用此类型来保存"添加"方法中的数据。由于键是唯一的,因此此索引仅适用于没有重复项的键。

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

这很奇怪-您通常使用多映射来直接允许重复。我猜为什么不呢,是因为你还没有准备好使用迭代器。实际上,您应该能够使用"insert"方法和"[]"订阅运算符(对于映射)实现这些方法。

  • http://www.cppreference.com/wiki/stl/map/start
  • http://www.cppreference.com/wiki/stl/set/start/开始