好的,这样我的代码了。
袋接口(interface)
#ifndef BAGINTERFACE_H
#define BAGINTERFACE_H
#include <vector>
#include <algorithm>
template<class ItemType>
class BagInterface
{
public:
virtual int getCurrentSize() const = 0;
virtual bool isEmpty() const = 0;
virtual bool add(const ItemType& newEntry) = 0;
virtual bool remove(const ItemType& anEntry) = 0;
virtual void clear() = 0;
virtual int getFrequencyOf(const ItemType& anEntry) const = 0;
virtual bool contains(const ItemType& anEntry) const = 0;
virtual std::vector<ItemType> toVector() const = 0;
};
#endif /* BAGINTERFACE_H */
袋
#ifndef BAG_H
#定义BAG_H
#include "BagInterface.h"
template <class ItemType>
class Bag: public BagInterface<ItemType>
{
public:
int getCurrentSize() const { return v.size(); }
bool isEmpty() const { return v.empty(); }
bool add(const ItemType& newEntry) { v.push_back(newEntry); return true; }
bool remove(const ItemType& anEntry) { std::remove(v.begin(), v.end(), anEntry); return true; }
void clear() { v.clear(); }
int getFrequencyOf(const ItemType& anEntry) const { return std::count(v.begin(), v.end(), anEntry); }
bool contains(const ItemType& anEntry) const { return true; }
std::vector<ItemType> toVector() const { return v; }
private:
std::vector<ItemType> v;
};
#endif /* BAG_H */
和我的实际程序main.cpp
#include <iostream> // For cout and cin
#include <string> // For string objects
#include "Bag.h" // For ADT bag
using namespace std;
int main()
{
string clubs[] = { "Joker", "Ace", "Two", "Three",
"Four", "Five", "Six", "Seven",
"Eight", "Nine", "Ten", "Jack",
"Queen", "King" };
// Create our bag to hold cards
Bag<string> grabBag;
Bag<string> dumpBag;
grabBag.add(clubs[1]);
grabBag.add(clubs[2]);
grabBag.add(clubs[4]);
grabBag.add(clubs[8]);
grabBag.add(clubs[10]);
grabBag.add(clubs[12]);
dumpBag.add(clubs[3]);
dumpBag.add(clubs[5]);
dumpBag.add(clubs[7]);
dumpBag.add(clubs[9]);
dumpBag.add(clubs[10]);
dumpBag.add(clubs[12]);
Bag<string> Itersection(Bag<string> bagToCompare){
return grabBag;
}
return 0;
}; // end main
我正在尝试找到两个袋子的交集,这将是一个新袋子,其中包含在原始两个袋子中都出现的条目。因此,基本上我需要设计并指定一个方法交集,该交集将接收到该方法调用的袋子与该方法的一个参数即袋子的交集作为新袋子返回。
假设bag1和bag2是bag; bag1包含字符串a,b和c; bag2包含字符串b,b,d和e。表达式bag1.intersection(bag2)返回仅包含字符串b的bag。
我已经做了两个袋子的比较,但是我不太确定如何设计交集方法。
任何帮助都会很棒。
谢谢。
最佳答案
由于枚举包装袋中物品的唯一方法是使用toVector
,因此您需要遍历其中一个输入包装袋的toVector
。对于每个物品,请在两个输入袋中均采用该物品的最小频率,并确保输出袋中包含该频率的物品。由于toVector
可能重复包含相同的项目,因此您必须检查输出包以查看它是否已包含您要考虑的项目。
我没有赶上C++ 11的步伐,所以我只是用一种老式的方式来做:
template<class T>
Bag<T> intersection(BagInterface<T> const &a, BagInterface<T> const &b) {
Bag<T> c;
std::vector<T> aItems = a.toVector();
for (int i = 0; i < aItems.size(); ++i) {
T const &item = aItems[i];
int needed = std::min(a.getFrequencyOf(item), b.getFrequencyOf(item));
int lacking = needed - c.getFrequencyOf(item);
for ( ; lacking > 0; --lacking) {
c.add(item);
}
}
return c;
}