我将如何使用独立于其键的比较器函数对 a执行 a find()
or函数,以使其仍以 O(log N) 时间运行?lower_bound()
std::set
假设我foo
用两个变量定义了一个数据类型x
,y
并且有一个std::set<foo>
用作x
键值的数据类型。
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
。这意味着 I 不能表达y
为 的函数x
,但也由y
within排序fooSetX
。
例如,给定 内的三个foo(x,y)
值 (2,5)、(3,9) 和 (5,10) fooSet
,作为搜索词的 alower_bound()
将y = 7
返回一个指向 (3,9) 的迭代器。
目前,我解决这个问题的方法是有两个s,分别由和std::set<foo>
排序。每当我需要搜索时,我都会使用第二个.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)