Объединение в цепочку упорядочивания предикатов (например, для станд.:: вид)

Краткий ответ: Формы цепочки не рассчитаны на полную динамику.

Более длинный ответ: В руководстве box2d.org объясняется, что формы Цепи предназначены для построения ваших статических миров. В этом отношении формы цепочек аналогичны формам краев:

они могут сталкиваться с кругами и многоугольниками, но не с самими собой.

blockquote>

Кроме того, они не предназначены для полностью динамического поведения, такого как фигуры, такие как многоугольник.

Надеюсь, что это отвечает на ваш вопрос.

10
задан philsquared 9 November 2008 в 19:29
поделиться

4 ответа

Вы можете построить небольшую систему цепочек, например, так:

struct Type {
  string first, last;
  int age;
};

struct CmpFirst {
  bool operator () (const Type& lhs, const Type& rhs) { return lhs.first < rhs.first; }
};

struct CmpLast {
  bool operator () (const Type& lhs, const Type& rhs) { return lhs.last < rhs.last; }
};

struct CmpAge {
  bool operator () (const Type& lhs, const Type& rhs) { return lhs.age < rhs.age; }
};

template <typename First, typename Second>
struct Chain {
  Chain(const First& f_, const Second& s_): f(f_), s(s_) {}

  bool operator () (const Type& lhs, const Type& rhs) {
    if(f(lhs, rhs))
      return true;
    if(f(rhs, lhs))
      return false;

    return s(lhs, rhs);
  }

  template <typename Next>
  Chain <Chain, Next> chain(const Next& next) const {
     return Chain <Chain, Next> (*this, next);
  }

  First f;
  Second s;
};

struct False { bool operator() (const Type& lhs, const Type& rhs) { return false; } };

template <typename Op>
Chain <False, Op> make_chain(const Op& op) { return Chain <False, Op> (False(), op); }

Затем использовать ее:

vector <Type> v;  // fill this baby up

sort(v.begin(), v.end(), make_chain(CmpLast()).chain(CmpFirst()).chain(CmpAge()));

Последняя строка немного многословно, но я думаю, что ясно, что предназначено.

8
ответ дан 3 December 2019 в 22:02
поделиться

Один стандартный способ обработать это состоит в том, чтобы отсортировать в нескольких передачах и использовать стабильный вид. Заметьте это std::sort обычно не стабильно. Однако существует std::stable_sort.

Тем не менее я записал бы обертку вокруг функторов, которые возвращают с тремя состояниями (представляющий меньше, равняется, больше).

2
ответ дан 3 December 2019 в 22:02
поделиться

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

И да это - действительно позор, который вид просит предикат: Я не вижу никакой другой путь, чем создают функтор, принимающий вектор функций с тремя состояниями...

2
ответ дан 3 December 2019 в 22:02
поделиться

Решение для объединения в цепочку является подробным. Вы могли также использовать повышение:: свяжите в сочетании со станд.:: logical_and для создания предиката сортировки. См. связанную статью для получения дополнительной информации: То, как повышение связывает библиотеку, может улучшить Ваши программы C++

1
ответ дан 3 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: