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/开始