迭代一组指针

时间:2012-12-11 05:31:55

标签: c++

在我目前的项目中,我有以下类型的设置:

typedef set<ItemPtr>            ItemSet;

其中ItemPtr是这个类:

class ItemPtr
{
    private:
    Item    *ptr;

    public:
    ItemPtr(Item *ptr) : ptr(ptr) { }
    Item* getPtr() const { return ptr; }
};

以下几集:

ItemSet bookList;
ItemSet movieList;
ItemSet musicAlbumList;

包含在名为Library的类中的所有集合。这些集合中的每一个都包含ItemPtr的实例,其中ItemPtr的每个实例都包含指向Book,Movie或MusicAlbum实例的指针。这些都是来自名为Item的类的派生类。 Book的一个实例,包含作者,标题,Pages数量以及该书共有的一组关键字。我有这样的功能:

const ItemSet* Library::itemsForKeyword(const string& keyword)
{
    return NULL;  //need to put code in here
}

需要返回每个集合中包含关键字参数的所有项目。我不确定如何遍历每个集合,并访问它的关键字,然后将它们与上述函数的参数进行比较。我该怎么做这样的比较?

这是我的Item类:

class Item
{
    public:
    string mTitle;
    string mArtist;
    Item(const string& title, const string& artist);
    Item();
    virtual ostream &print(std::ostream &os) const
    {
        os << "author: \t" << mArtist << endl;
        os << "title: \t" << mTitle << endl;
        return os;
    }
    virtual ~Item();
    set<string>  keywordsList;
    void addKeywords(string keyword);
};

这是addKeywords函数:

void Item::addKeywords(string keyword)
{
keywordsList.insert(keyword);
}

到目前为止,我已经编写了我需要的功能:

const ItemSet* Library::itemsForKeyword(const string& keyword)
{
ItemSet temp;

for(it=bookList.begin();it!=bookList.end();it++){
    if(it->getPtr()->keywordsList)


}

return &temp;
}

我知道通过使用我的迭代器引用getPtr,它可以访问keywordsList,但从那时起我不知道如何检查列表以将其与传入的关键字进行比较。我的计划是,在比较并找到匹配项后,将实例存储在temp中,然后使用包含该关键字的所有项目传回temp。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

就简单迭代而言,有几种方法可以做到:

在C ++ 11之前:

const ItemSet* item_set = // ...
for (ItemSet::const_iterator it = item_set->begin(); it != item_set->end(); ++it) {
   const ItemPtr item = *it;
   // ...
}

在C ++ 11之后(使用自动):

const ItemSet* item_set = // ...
for (auto it = item_set->cbegin(); it != item_set->cend(); ++it) {
  const ItemPtr item = *it;
}

在C ++ 11之后(使用ranged-for):

const ItemSet* item_set = // ...
for (auto item : *item_set) {
   // ...
}

至于处理每个项目,您需要首先向我们展示Item的代码以及您自己的一些尝试。

答案 1 :(得分:0)

使用std :: set :: find检查关键字是否存在于集合中 http://www.cplusplus.com/reference/set/set/find/

注意:你所谈到的所有帖子都是在列表中查找关键字。它不是您正在使用的列表。你正在使用一套。