我有一個簡單MyElement的類,我想用一個bool MyElement::SomeMethod(...) {...}作為一個自定義比較std::set的MyElement專案。
我已經進行了研究,并且我已經知道一些替代解決方案,我在下面列出了這些解決方案。我也知道如何更改比較器,例如,使用以下代碼std::greater代替默認值std::less:
std::set<MyElement, std::greater<MyElement> > s;
我的確切問題是我想bool MyElement::SomeMethod(...) {...}用作自定義比較器。我想出的唯一解決方案類似于下面串列中的最后一個,即布爾函式的解決方案:
using Cmp = std::integral_constant<decltype(&MyElement::SomeMethod),
&MyElement::SomeMethod>;
std::set<MyElement, Cmp> my_set;
但是,此解決方案僅適用于static MyElement::SomeMethod。
我想知道非靜態方法是否有類似的或更簡潔的方法。
替代解決方案串列:
C 20 的方法
auto cmp = [](const MyElement& lhs, const MyElement& rhs) { return ... };
std::set<MyElement, decltype(cmp)> s;
C 11 的方法
auto cmp = [](const MyElement& lhs, const MyElement& rhs) { return ... };
std::set<MyElement, decltype(cmp)> s(cmp);
函式而不是 lambda
bool cmp(const MyElement& lhs, const MyElement& rhs) { return ...; }
接著
std::set<MyElement, decltype(cmp)*> s(cmp);
或者
std::set<int, decltype(&cmp)> s(&cmp);
結構體和運算子()
struct cmp {
bool operator() (const MyElement& lhs, const MyElement& rhs) const {
return ...
}
};
接著
std::set<MyElement, cmp> s;
布爾函式
bool cmp(const MyElement& lhs, const MyElement& rhs) {
return ...;
}
接著
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
std::set<MyElement, Cmp> s;
uj5u.com熱心網友回復:
這有點主觀,但對我來說最干凈的選擇是 struct operator() 來匹配 的定義std::less,std::set. 其他選項沒有任何問題,但比較函子是一種常見模式并且易于識別。
您也可以定義MyElement::operator<,然后您就不需要單獨傳入比較器。
uj5u.com熱心網友回復:
您可以使用std::mem_fn來系結成員函式。
#include <functional>
#include <iostream>
#include <set>
#include <utility>
struct S {
int i;
bool cmp(const S& other) const { return i < other.i; }
};
// Define make function to avoid having to write out template types.
template <typename T, typename Cmp>
std::set<T, Cmp> make_set(Cmp&& cmp) {
return std::set<T, Cmp>{std::forward<Cmp>(cmp)};
}
int main(int argc, char* argv[]) {
auto s = make_set<S>(std::mem_fn(&S::cmp));
s.emplace(S{0});
std::cout << s.begin()->i << std::endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/400663.html
