#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<string, int> aa, pair<string, int> bb) {
return (aa.second == bb.second ? aa.first < bb.first : aa.second > bb.second);
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
map<string, set<pair<string, int>, decltype(cmp)>> store;
}
我试图制作这种类型的容器,但它显示错误。有人可以告诉我为什么地图不能存储这个吗?
关键错误可以在GCC给你的错误消息中看到:
.../stl_tree.h:140:33: error: data member 'std::_Rb_tree_key_compare<bool(...)>::_M_key_compare' invalidly declared function type
140 | _Key_compare _M_key_compare;
| ^~~~~~~~~~~~~~
decltype(cmp)
是一个函数类型,因为 cmp
是一个函数。您可能想要 decltype(cmp)*
这将是一个函数指针。
但是,如果您使用函数指针类型作为
std::map
的比较,则每次创建要插入的 std::set
时,您还需要提供函数指针。这将是相当乏味的,解决这个问题的方法是创建一个新类型:
struct cmp {
bool operator()(pair<string, int> aa, pair<string, int> bb) const {
return (aa.second == bb.second ? aa.first < bb.first : aa.second > bb.second);
}
};
// ...
map<string, set<pair<string, int>, cmp>> store;