【发布时间】:2013-05-02 12:00:33
【问题描述】:
好吧,我的问题是我正在使用带有自定义比较器的 std::set,例如:
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 );
但是,当然,它除了 A* 而不是 short int。
所以,我知道我可以使用 std::find_if,但它不会使自定义比较器变得无用吗?它会迭代整个列表,不是吗?有什么方法可以将 find 用于 hashCode 而不是对象本身?
谢谢!
【问题讨论】:
-
带比较器的 std::find_if 怎么样(调整相等)?
-
对不起,这就是我写
std::find时的意思,应该是std::find_if。它不会迭代整个列表,并且根本不优化搜索吗?我使用std::set的原因是它的 O(log(n)) 搜索成本。
标签: c++ comparator stdset