0

現在のプロジェクトでは、次のタイプのセットがあります。

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;

ライブラリと呼ばれるクラスに含まれるすべてのセットです。これらの各セットには、ItemPtr のインスタンスが含まれており、ItemPtr の各インスタンスには、Book、Movie、または MusicAlbum のインスタンスへのポインターが含まれています。これらはそれぞれ、Item というクラスから派生したクラスです。Book のインスタンスには、著者、タイトル、ページ数、およびその本に共通する一連のキーワードが含まれます。私はそのような機能を持っています:

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 にアクセスできることはわかっていますが、その時点から、リストを調べて、渡されたキーワードと比較する方法がわかりません。私の計画は、比較して一致を見つけた後、インスタンスを一時的に保存し、そのキーワードを含むすべてのアイテムとともに一時を返すことです。これまでご協力いただきありがとうございました。

4

2 に答える 2

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 以降 (auto を使用):

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) {
   // ...
}

各アイテムの処理に関しては、最初にアイテムのコードと独自の試みのいくつかを提示する必要があります。

于 2012-12-11T05:40:52.210 に答える
0

std::set::find を使用して、キーワードがセット http://www.cplusplus.com/reference/set/set/find/に存在するかどうかを確認します

注:投稿全体で、リスト内のキーワードを見つけることについて話している. あなたが使っているのはリストではありません。セットでご利用いただいております。

于 2012-12-11T06:45:29.663 に答える