Stl Set找到一个项目c ++

时间:2010-03-10 04:18:15

标签: 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类是项类的超类。

谢谢..

3 个答案:

答案 0 :(得分:1)

“惯用”方式可能是使用std::remove_copy_if algorithm。它看起来像这样:

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

但说实话,我认为泰勒的方法更简单,更清晰。

答案 1 :(得分:0)

最简单的方法是:

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)时间内运行,但它完全没有利用你正在使用集合的事实。这些也可以在向量中。使用“索引”集之前使用它的方式实际上是一种性能更快的解决方案,尽管它需要更多的内存。另外,可能会比插入方法更频繁地调用检索方法,因此在插入时进行更多工作以便在检索期间节省工作是有意义的。但是当然如果你这样做,你会希望索引集是私有成员,而不是全局成员。

在这里你也应该非常小心你的记忆管理。您从ItemSet方法返回musicByBand的const指针这一事实让我感到担忧。为什么它不仅仅是你要回归的ItemSet

答案 2 :(得分:0)

这是一个示例代码,它使用带有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));
    }
}