Изменить std :: set для поиска элемента по типу T - PullRequest
0 голосов
/ 09 января 2019
template<class T>
class State {
    T state;
    double cost = 0;
    State<T> *cameFrom = nullptr;

У меня есть этот шаблон класса, и я хочу создать std::set<State<T>>

оператор < класса возвращает this.cost < other.cost

оператор == класса возвращает this.state == other.state

допустим, я хочу проверить, есть ли State<T> x в наборе

как сделать так, чтобы набор возвращал iter! - end () (вызов set.find(x)), если в наборе содержится State<T> с теми же state(x.state), что и x?

1 Ответ

0 голосов
/ 09 января 2019

std::set не заботится о operator==, он использует отношение эквивалентности, определенное для получения тех же результатов, что и

bool equiv(T a, T b)
{
    if (a < b) return false;
    if (b < a) return false;
    return true;
}

Если у вас есть State<T> значения с отличающимися state, но равными cost, только один из них может войти в ваш std::set.

Вы можете иметь успех с boost::multi_index_container, где вы можете искать вещи по или cost или state

namespace bmi = boost::multi_index;
using state_set = boost::multi_index_container<State<T>, 
    bmi::indexed_by<
        bmi::ordered_unique<bmi::member<State<T>, double, &State<T>::cost>>,
        bmi::ordered_non_unique<bmi::member<State<T>, T, &State<T>::state>>
    >
>;

state_set set = ...;
auto & states_view = set.nth_index<1>();
if (auto it = states_view.find(x); it != states_view.end())
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...