c++ - 在 std::set 中按键查找
问题描述
我正在努力std::set
支持自定义比较操作。我的目标是能够仅使用 key 参数调用 find ,而无需先创建 set 类型的对象。像这样的东西:
#include <set>
#include <cstdint>
#include <vector>
class TestItem {
public:
std::uint64_t id; // key
std::vector<double> areas; // some other data
};
struct TestItemCompare {
bool operator()(const std::uint64_t& lhs, const std::uint64_t& rhs) {
return lhs < rhs;
}
bool operator()(const std::uint64_t& lhs, const TestItem& rhs) {
return lhs < rhs.id;
}
bool operator()(const TestItem& lhs, const std::uint64_t& rhs) {
return lhs.id < rhs;
}
bool operator()(const TestItem& lhs, const TestItem& rhs) {
return lhs.id < rhs.id;
}
};
int main() {
std::set<TestItem, TestItemCompare> store;
std::uint64_t id = 0;
TestItem t;
t.id = 0;
auto it1 = store.find(t); // compiles
auto it2 = store.find(id); // fails to compile
return 0;
}
我以为这是可能的...
解决方案
有可能的。但是您的比较器必须是透明的。而且functor中的成员函数必须是const
struct TestItemCompare {
using is_transparent = int; // actually any alias will do, void, custom type
bool operator()(const std::uint64_t& lhs, const std::uint64_t& rhs) const {
return lhs < rhs;
}
bool operator()(const std::uint64_t& lhs, const TestItem& rhs) const {
return lhs < rhs.id;
}
bool operator()(const TestItem& lhs, const std::uint64_t& rhs) const {
return lhs.id < rhs;
}
bool operator()(const TestItem& lhs, const TestItem& rhs) const {
return lhs.id < rhs.id;
}
};
推荐阅读
- html - Angular Ionic ion-select ngModel 未绑定到值
- windows - 如何获取特定桌面图标的 GUID?
- c# - Xamarin 表单从列表中设置选择器 SelectedItem
- angular - 在 RxJS 中组合多个 http 调用
- c# - 为什么增量有点复杂?
- r - 如何融化关于所有变量的矩阵,其中 id 变量是 row.names?
- docker - 无法自动替换发布管道中的 docker 标签
- date - Google 表格函数“=Year(2001)”返回 1905
- javascript - 如何解决事件监听器不起作用的问题?以及如何获取输入的文本值?
- python - UnboundLocalError:分配前引用的局部变量“validSqaures”