【发布时间】:2017-03-17 11:42:02
【问题描述】:
我将如何使用独立于其键的比较器函数在 std::set 上执行 find() 或 lower_bound() 函数,以便它仍然在 O(log N) 时间内运行?
假设我用两个变量x 和y 定义了一个数据类型foo,并有一个使用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,那么@ 987654338@。这意味着我不能将y 表达为x 的函数,而是在fooSetX 中由y 排序。
例如,给定 foo(x,y) 内的三个 foo(x,y) 值 (2,5)、(3,9) 和 (5,10),以 y = 7 作为搜索词的 lower_bound() 将返回一个指向 (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)
【问题讨论】:
标签: c++ set stdset lower-bound