Полиморфная функция сравнения STL (класс cmp class, класс cmp int) для сортировки - PullRequest
1 голос
/ 01 октября 2010

Я реализую игру.У меня есть дерево состояний и очередь приоритетов на основе набора <>, которая сортирует состояния по их стоимости.Для этого у меня есть оператор <, реализованный как: </p>

struct DereferenceCompareState : 
public std::binary_function<State*, State*, bool>
{

  bool operator()(const State* lhs, const State* rhs) const
  {
    verbose6("comparing " << lhs->getCost() << " with " << rhs->getCost());
    return lhs->getCost() < rhs->getCost();
  }

};

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

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Проблема в том, что set по определению является ассоциативным контейнером, в котором сами элементы являются ключами.Однако вам кажется, что вам нужен контейнер, в котором ключ - это скорее выражение, производное от элемента, но не от самого элемента.

Так что, если вы когда-нибудь будете искать стоимость вашего состояния,тогда сделайте это map<int, State*> с ценой, являющейся ключом.Если вы хотите выполнить поиск по самому состоянию и по стоимости (и, возможно, другим свойствам), то я бы предложил использовать Boost MultiIndex , что позволяет иметь несколько индексов (включаяидентичность, как набор) над одним контейнером.Если вы используете упорядоченный индекс для getCost(), вы также получите upper_bound() для этого индекса, который будет делать именно то, что вы хотите.

1 голос
/ 01 октября 2010

Вы можете легко добавить более гибкую возможность сравнения к struct DereferenceCompareState, перегрузив operator() больше, но это не поможет с тем, что вы пытаетесь.Реальная проблема, с которой вы столкнулись, заключается в том, что std::set<T,Cmp>::upper_bound() принимает только тип ключа / значения (T) в качестве аргумента.Поэтому независимо от того, что вы делаете со своим типом сравнения, вы не сможете вызвать s.upper_bound(5); Лучше всего просто использовать временный объект State, как вы описали.

...