好吧,所以我一直在编程中苦苦挣扎,现在,我开始编写一个非常困难的编程,这是假设是分配中较容易的部分之一...但基本上,这就是我应该做的事情(我将复制并粘贴提示,然后写出它意味着什么,只是为了澄清):
你的第一个任务是为累加器InOrder编写一个模板 通过.put(item)方法接受一系列项目,并通过.get()方法返回true或false,指示序列是否有序。
好吧,所以对你们中的一些人来说可能并不困难,但基本上我应该做的就是为这个类编写头文件代码,然后使用这个方法:
// The put method of anAccumulator has been applied
// to all values accessed by interators begin up to end.
template<typename A, typename I>
void
apply(A & anAccumulator, I begin, I end)
{
for (I iter = begin; iter != end; ++iter)
{
anAccumulator.put( *iter);
}
}
这是我到目前为止我的TInOrder.h头文件:
// Declares the class for InOrder.
#include <algorithm>
#include <vector>
#ifndef __INORDER_H_
#define __INORDER_H_
template <typename T>
class InOrder
{
public:
InOrder() : _count(0)
{};
void put(T item)
{
data = item;
while (item < data)
{
yOrder = true;
}
}
bool get()
{
if (yOrder == true)
{
return true;
}
else
{
return false;
}
}
private:
bool yOrder;
bool _count;
T data;
};
#endif
显然,我不知道自己在做什么。但是,根据我的理解,我应该以某种方式使用.put()和.get()方法,而不需要列表,向量,堆栈或队列。这是我的TA在电子邮件中写给我的内容,我认为他比我更好地解释了它:
我希望这会有所帮助。根据电子邮件中的说明,您的类似乎不需要从命令行获取输入。您只需要定义.put()方法。 (即)你的班级并不关心输入的来源。既然你的班级一次只能获得一个输入,我相信你能够弄清楚如何判断到目前为止看到的序列是否依次而你不是甚至需要存储到目前为止看到的所有值。不要使用矢量,列表或任何其他容器。
所以我真正的问题是:你如何使用.put()方法来测试用户输入是否有序?我真的很难将这一切都弄清楚,我希望有人可以帮助我理解它背后的逻辑。我知道它应该是涉及比较和覆盖的东西,但不仅如此。一个例子就是很棒。我非常感谢,谢谢!
答案 0 :(得分:1)
您只需保留旧值并将新项目与其进行比较。
假设T
是默认的可构造和可复制的:
template <typename T>
class InOrder
{
public:
InOrder() : inOrder(true), initialized(false), oldValue() {}
void put(const T& item)
{
if (initialized && item < oldValue) {
inOrder = false;
}
oldValue = item;
initialized = true;
}
bool get() const { return inOrder; }
private:
bool inOrder;
bool initialized;
T oldValue;
};
boost::optional<T>
可能会取代bool initialized; T oldValue;
。