【问题标题】:help with set & map on STL for c++帮助在 C++ 的 STL 上设置和映射
【发布时间】:2010-02-24 00:04:24
【问题描述】:

我正在上 CS 课,大部分作业都是用 Java 完成的。在上一个 java 作业中,我们学习了集合。这个作业我们使用的是 c++,我需要学习 STL 所需的书都是java的。我们得到了这个网页http://www.cplusplus.com/ 但是,那和谷歌不会让我完成任务。 你能推荐一本关于 STL 和 c++ 的好书吗?我主要需要学习 set 和 map。

这个作业是关于一个媒体库(书籍、cd、dvd 信息)

我们得到了一个可以使用的骨架程序,在图书馆课程中,我不确定集合和地图实际上是什么,关于书籍、CD、DVD 信息的内容......?有人可以根据功能告诉我什么设置/映射吗?

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;
};

【问题讨论】:

    标签: c++


    【解决方案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】:

      我发现STL Tutorial and Reference Guide 对学习基本的 STL 数据结构非常有帮助。

      【讨论】:

        【解决方案3】:

        “好书”部分已在其他地方处理 - 例如here.

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

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

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

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

        这很奇怪 - 您通常会使用多图来直接允许重复。我猜为什么不这样做的原因是您还没有为迭代器做好准备。实际上,您应该能够使用“插入”方法和(对于地图)“[]”下标运算符来实现这些方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多