Вопрос

Я работаю над системой, где мне нужно иметь возможность сортировать вектор с помощью данного предиката, который мои классы не должны контролировать. По сути, я прохожу им производственный класс, и они слепо сортируют на нем.

Как один из «восхитительных причуд», одним из моделей сорта является порядок входа. Вот что у меня есть до сих пор.

struct Strategy
{
   virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};

struct strategyA : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return true;
   }
};

struct strategyB : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getID() > rhs.getID();
   }
};

struct strategyC : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getFee() > rhs.getFee();
   }
};

Очевидно, что, поскольку стратегия рефлексивна, ее нельзя использовать, и если я установит ее на ложь, она будет относиться ко всему как к равным, и я смогу поцеловать свои данные на прощание.

Итак, вот мой вопрос. Есть ли способ определения функции предиката для сортировки вектора, которая ничего не изменит?

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

Это было полезно?

Решение

Лично я думаю, что ваш класс стратегии должен иметь метод «сортировки». Таким образом, это может либо вызвать std :: sort, либо нет, так как он считает нужным. Будь то а также как становится частью стратегии сортировки.

Ответ Darios stable_sort очень хорош, если вы можете его использовать.

Можно сортировки на основе позиции элемента в векторе, но это не означает, что элементы не будут двигаться (многие алгоритмы сортировки в основном будут карабкаться с вашими данными), поэтому у вас должен быть надежный способ определения Где были предметы, когда вы начали.

Для сравнения можно сохранить картирование тока с оригинальной позицией, но много работы. В идеале логика должна быть встроена в алгоритм сортировки - не только сравнение - и это по сути, как работает stable_sort.

Другая проблема - в зависимости от контейнера - порядок (скажем) адресов, не всегда порядок элементов.

Другие советы

Есть ли способ определения функции предиката для сортировки вектора, которая ничего не изменит?

Это зависит от алгоритма. Если ваш вид стабильный вид, Порядок «равных» элементов не будет изменен (что не определен для нестабильных видов).

Рассмотрим использование std::stable_sort.

Если вы говорите просто вектор, возможно, вы можете сойти с рук, предоставляя интерфейс, который определяет, следует ли вы сортировать или нет. Векторы не являются упорядоченным контейнером, поэтому вам нужно явно сортировать их. Только не сортируйте их вообще.

Нет никакой функции, которая бы сохранила порядок элементов на основе значений элементов. Вам нужно предоставить больше информации своему Strategy, если это возможно.

Другой подход может заключаться в том, чтобы донести семантику ваших данных в контейнер. Подумайте об использовании boost :: multi_index для различных способов доступа и упорядочения на одних и тех же данных:

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top