簡體   English   中英

Stl Set查找項目C ++

[英]Stl Set find an item c++

我有一個我想在其中找到物品的地方。 現在我有全局對象,用於存儲我的發現-(ItemSetMap allMusicByBand)

我想擺脫這個,直接搜索集合。

所有的CD信息都存儲在專用部分中-(ItemSet allCDS;)

這是library.cpp-

評論的代碼是我進行搜索並將其添加到全局對象的地方...

我想改為在musicByBand函數中進行搜索。

#include "Library.h"
#include "book.h"
#include "cd.h"
#include "dvd.h"

#include <iostream>




//ItemSetMap allBooksByAuthor;       //these are what i am trying to get away from...
ItemSetMap allmoviesByDirector;
ItemSetMap allmoviesByActor;

//ItemSetMap allMusicByBand;
ItemSetMap allMusicByMusician;


const Item* Library::addMusicCD(const string& title, const string& band, const int nSongs)
{

CD* item = new CD(title,band,nSongs);

allCDS.insert(item);

//ItemSetMap::iterator myband = allMusicByBand.find(band);

//if(myband != allMusicByBand.end())
//{
    //myband->second->insert(item);

//}
//else{
    //ItemSet* obj = new ItemSet();
    //obj->insert(item);
    //allMusicByBand.insert(make_pair(band, obj));
//}




return item;
    }


const ItemSet* Library::musicByBand(const string& band) const
{



return allMusicByBand[author];
}

我希望我對我想要的東西足夠清楚。

我試圖遍歷它。 我已經嘗試了幾乎所有我能想到的東西。CD類是項類的超類。

謝謝..

一種“慣用的”方法可能是使用std :: remove_copy_if算法 它看起來像這樣:

class NotMatching {
   string bandName_;
public:
   NotMatching( const string& band ) : bandName_( band ) {}
   bool operator()( const Item& item ) {
      return item.bandName() != bandName_;
   }
};

const ItemSet musicByBand(const string& band)
{
   ItemSet matchingItems;

   std::remove_copy_if( allCDS.begin(), allCDS.end(),
      insert_iterator< ItemSet >( matchingItems, matchingItems.begin() ),
      NotMatching( band ) );

   return matchingItems;
}

但老實說,我認為泰勒的方法更簡單明了。

最簡單的方法是:

const ItemSet* Library::musicByBand(const string& band) const
{
    ItemSet* bandMusic = new ItemSet();

    for (ItemSet::const_iterator i = allCDs.begin(); i != allCDs.end(); ++i)
    {
      if ((*i)->getBand() == band) {
        bandMusic->insert(*i);
      }
    }

   return itemSet;
}

盡管這是在O(n)時間中運行的,但這完全沒有利用您使用集合的事實。 這些也可能在向量中。 以前使用“索引”集進行處理的方法實際上是一種性能更快的解決方案,盡管它會占用更多的內存。 另外,大概檢索方法的調用頻率要比插入方法要高得多,因此有意義的是在插入上進行更多工作,以節省檢索期間的工作。 但是,當然,如果這樣做,您將希望索引集是私有成員,而不是全局成員。

您還應該在這里對內存管理非常小心。 你是一個常量指針返回到一個事實ItemSetmusicByBand方法與我有關。 為什么它不只是您要返回的ItemSet

這是一個示例代碼,它使用帶有std::find_if算法的std::find_if函數來搜索set的特定元素

struct BandComparison : public std::binary_function<Item*, std::string, bool>
{
public:
    bool operator()(Item* pItem, const std::string& bandName) const
    {
        bool equal = false;
        CD* pCD = dynamic_cast<CD*>(pItem);
        if(pCD)
        {
            equal = pCD->getBand() == bandName;
        }
        return equal;
    }
};

void Library::addCD(const std::string &band)
{
    //First check whether CD with this band name exists
    ItemSet::iterator iter = std::find_if(m_cds.begin(), m_cds.end(), std::bind2nd(BandComparison(), band));
    if(iter == m_cds.end())
    {
        m_cds.insert(new CD(band));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM