我该如何执行一个find()
或lower_bound()
功能std::set
使用比较函数是独立于它的关键,使它仍然运行在O(log N)时间?C++ std :: set用自定义lower_bound
假设我定义数据类型foo
两个变量x
和y
和具有使用x
作为密钥值的std::set<foo>
。
struct foo {
int x, y;
foo(int x, int y) : x(x), y(y) {}
};
struct xCompare {
bool operator() (const foo& i, const foo& j) const {
return i.x < j.x;
}
};
// Within main()
std::set<foo, xCompare> fooSetX;
是否有可能进行使用lower_bound()
或比较的y
值一些其他的功能的二进制搜索?
对于这种说法的缘故,假定x
和y
是独一无二的,相互独立的,并且给出了两个foo
变量foo1
和foo2
,如果foo1.x < foo2.x
,然后foo1.y < foo2.y
。这意味着我无法将y
作为x
的函数来表示,但也可以通过在fooSetX
内进行排序。
例如,给定3个foo(x,y)
值内fooSet
(2,5),(3,9)和(5,10),一个lower_bound()
这需要y = 7
作为搜索项将返回一个迭代指向(3,9 )。
目前,我解决这个问题的方法是有两个std::set<foo>
s,分别按x
和y
排序。每当我需要通过y
进行搜索时,我使用第二个std::set
。
struct yCompare {
bool operator() (const foo& i, const foo& j) const {
return i.y < j.y;
}
};
// Within main()
std::set<foo, yCompare> fooSetY;
// Inserting elements
fooSetX.insert(foo(2,5)); fooSetY.insert(foo(2,5));
fooSetX.insert(foo(3,9)); fooSetY.insert(foo(3,9));
fooSetX.insert(foo(5,10)); fooSetY.insert(foo(5,10));
// lower_bound() with y = 7
std::set<foo>::iterator it = fooSetY.lower_bound(foo(0,7)); // points to (3,9)
哦查找。所以在我的问题中提到的例子中,该集合将如何构建(我的意思是实际代码)? –
@MuhammadIrhamRasyidi:哎呀,我误解了你的问题 - 你已经把一个比较器传递给了'std :: set <...>'......好吧,当调用'std :: set时,没有办法使用与'yCompare'不同的比较器:: lower_bound'。 –
噢,伙计。我的想法之一是手动遍历二叉搜索树从根到叶,但我不知道如何做到这一点。 –