Ну, моя проблема заключается в том, что я использую зЬй :: установить с помощью пользовательского компаратора, что-то вроде:C++ станд :: набора пользовательского компаратор
class A
{
public:
A(int x, int y):
_x(x), _y(y)
{
}
int hashCode(){ return (_y << 16) | _x; }
private:
short int _y;
short int _x;
};
struct comp
{
bool operator() (A* g1, A* g2) const
{
return g1->hashCode() < g2->hashCode();
}
};
Итак, я использую его как
std::set<A*, comp> myset;
// Insert some data
A* a = new A(2,1);
A* b = new A(1,3);
myset.insert(a);
myset.insert(b);
Теперь моя проблема заключается в том, что я хотел бы сделать это:
myset.find((2 << 16) | 1);
Но, конечно, это excepts A * не короткий Int.
Итак, я знаю, что могу использовать std :: find_if, но разве это не сделает бесполезным пользовательский компаратор? Он будет перебирать весь список, не так ли? Есть ли способ использовать find с hashCode, а не сам объект?
Спасибо!
Как насчет std :: find_if с компаратором (с поправкой на равенство)? – stardust
Извините, что я имел в виду, когда писал 'std :: find', это должно быть' std :: find_if'. Разве он не повторил бы весь список и не оптимизировал бы поиск вообще? Моя причина использования 'std :: set' - это стоимость поиска O (log (n)). – Guillem