对字符串和原始数据类型应用大于或小于检查?

时间:2015-10-14 17:09:13

标签: c++ class templates accumulator

我正在处理一个项目,该项目要求我为Accumulator创建一个模板类,该模板类返回天气与否,传递给它的列表是有序的。订单递增。

我可能已经过度思考了这个问题,但我似乎无法弄清楚如何对原始数据类型和字符串进行大于/小于检查。我将澄清: 过程如下: 声明了一个列表/向量,并将东西存储在其中。 然后调用名为apply的辅助累加器。 此累加器(apply)遍历列表,在列表中的每个值上调用InOrder累加器的.put()方法。值可以是double,long,short等类型或字符串。

我尝试设置任意下限,将其设置为等于列表中的第一个元素,然后根据该起点进行检查,但这会产生混合结果,因为它不适用于字符串。

我正在考虑检查typeid或其他东西,以便对于字符串我可以调用.size()方法并比较那种方式。就原始而言,我只想使用>或者<运营商。但这会破坏模板功能的重点。任何帮助将不胜感激。

我发布代码的是调用函数,Apply Accumulator的代码和InOrder的代码。如果需要其他任何内容,请告诉我。

我的InOrder:

template<typename T>
class InOrder
{
public:

InOrder(){}
~InOrder(){}

void put(T item)
{
    _count++;
    if(_count == 1)
    {
        _lowbound = item;
    }
    if(_count!=0 && _count!=1 && item<_lowbound)
    {
        _order = false;
    }
   if(_count!=0 && _count!=1 && item>_lowbound)
   {
       _order = true;
   }
    _count++;
}
bool get()
{
    return _order;
}

private:
T _lowbound;
int _count = 0;
bool _order;
};

申请累积器:

template<typename A, typename I>
void apply(A & anAccumulator, I begin, I end)
{
for (I iter = begin; iter != end; ++iter)
{
    anAccumulator.put( *iter);
}
}

调用InOrder的代码:

{
    // Read a list of doubles into a List and check their order
    cout << "apply InOrder to a List of doubles\n";
    double sentinel = -1.23;
    List<double> dList;
    fillList(sentinel, dList);
    InOrder<double> dblInOrder;
    apply(dblInOrder, begin(dList), end(dList));
    cout << "The doubles in dList are ";
    if (!dblInOrder.get())
        cout << "NOT ";
    cout << "in order\n\n";
}
{
    // Read a list of strings into a List and check their order
    cout << "apply InOrder to a List of strings\n";
    string strSent = "end";
    List<string> sList;
    fillList(strSent, sList);
    InOrder<string> strInOrder;
    apply(strInOrder, begin(sList), end(sList));
    cout << "The strings in sList are ";
    if (!strInOrder.get())
        cout << "NOT ";
    cout << "in order\n\n";
}

我应该注意,放入列表的项目按相反的顺序处理 例如:如果我在[a,b,c]或[1,2,3]中键入我的列表,则要处理的第一个值/字符串将是c / 3,然后依次为b / 2和a, 1

2 个答案:

答案 0 :(得分:0)

这不会起作用:

if(_count!=0 && _count!=1 && item<_lowbound)
{
    _order = false;
}

因为应该是:

InOrder() : _order(true) {}

删除第二部分,然后添加:

 _order = false; // here is you have to stop and skip all other items

给你的构造函数。

答案 1 :(得分:0)

你的错误是当你发现订单错误时你不会停止:

{{1}}