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())
...