[英]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)时间中运行的,但这完全没有利用您使用集合的事实。 这些也可能在向量中。 以前使用“索引”集进行处理的方法实际上是一种性能更快的解决方案,尽管它会占用更多的内存。 另外,大概检索方法的调用频率要比插入方法要高得多,因此有意义的是在插入上进行更多工作,以节省检索期间的工作。 但是,当然,如果这样做,您将希望索引集是私有成员,而不是全局成员。
您还应该在这里对内存管理非常小心。 你是一个常量指针返回到一个事实ItemSet
从musicByBand
方法与我有关。 为什么它不只是您要返回的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.