为什么这种类型的嵌套在 C++ 中是不可能的?

问题描述 投票:0回答:1
#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;

}

我试图制作这种类型的容器,但它显示错误。有人可以告诉我为什么地图不能存储这个吗?

c++ stl
1个回答
0
投票

关键错误可以在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;
© www.soinside.com 2019 - 2024. All rights reserved.