Применять проверки «больше или меньше» для строковых и простых типов данных?

Я работаю над проектом, который требует, чтобы я создал шаблонный класс для Аккумулятора, который возвращает погоду или нет, список, переданный ему в порядке. Заказ по возрастанию.

Я, вероятно, переосмысливаю проблему, но не могу понять, как сделать проверку больше / меньше, чем на примитивных типах данных и строках. Я уточню:
Процесс идет так:
Список / вектор объявляется, и материал хранится в нем.
Затем вызывается вторичный аккумулятор под названием apply.
Этот Аккумулятор (применить) выполняет итерации по списку, вызывая метод .put () Аккумулятора InOrder для каждого значения в списке. Значения могут иметь тип 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

0

Решение

Ваша ошибка в том, что вы не останавливаетесь, когда обнаруживаете, что заказ неверен:

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

Другие решения

Это не сработает:

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

потому что должно быть:

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

Удалить вторую часть и добавить:

InOrder() : _order(true) {}

Вашему конструктору.

0