我該如何執行一個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'。 –
噢,夥計。我的想法之一是手動遍歷二叉搜索樹從根到葉,但我不知道如何做到這一點。 –